1 约束概述
作用:
1.定义规则
2.确保完整性 精确 可靠
2 非空约束
在创建表时设置非空约束
create table userinfo_1(
id number(6),
username varchar2(20) not null,
userpwd varchar2(20) not null);
SQL> desc userinfo_1
名称 是否为空? 类型
ID NUMBER(6)
USERNAME NOT NULL VARCHAR2(20)
USERPWD NOT NULL VARCHAR2(20)
不插入数据会显示错误
SQL> insert into userinfo_1(id)
2 values(1);
insert into userinfo_1(id)
*
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 (“SYSTEM”.”USERINFO_1”.”USERNAME”)
在修改时添加非空约束
**ALTER TABLE table_name
MODIFY column_name datetype NOT NULL;**
SQL> alter table userinfo
2 modify username varchar2(20) not null;
表已更改。
SQL> desc userinfo;
名称 是否为空? 类型
ID NUMBER(6)
USERNAME NOT NULL VARCHAR2(20)
USERPWD VARCHAR2(20)
EMAIL VARCHAR2(30)
REGDATE DATE
除去非空约束
**ALTER TABLE table_name
MODIFY column_name datatype NULL;**
SQL> alter table userinfo
2 modify username varchar(20) null;
表已更改。
SQL> desc userinfo
名称 是否为空? 类型
ID NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
EMAIL VARCHAR2(30)
REGDATE DATE
3 **主键约束
作用:确保每一行数据的唯一性
一张表只能设计一个主键约束
主键约束可以由多个字段构成(联合主键,复合主键)**
**在创建表时设置主键约束
PRIMARY KEY**
SQL> create table userinfo_p(
2 id number(6) primary key,
3 username varchar2(20),
4 userpwd varchar2(20));
表已创建。
SQL> desc userinfo_p
名称 是否为空? 类型
ID NOT NULL NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
*表级约束:
CONSTRAINT constraint_name PRIMARY key(column_name1,…)*
SQL> create table userinfo_p1(
2 id number(6),
3 username varchar2(20),
4 userpwd varchar2(20),
5 constraint pk_id_username primary key(id,username));
表已创建。
SQL> desc userinfo_p1;
名称 是否为空? 类型
ID NOT NULL NUMBER(6)
USERNAME NOT NULL VARCHAR2(20)
USERPWD VARCHAR2(20)
SQL> desc user_constraints
名称 是否为空? 类型
OWNER VARCHAR2(30)
CONSTRAINT_NAME NOT NULL VARCHAR2(30)
CONSTRAINT_TYPE VARCHAR2(1)
TABLE_NAME NOT NULL VARCHAR2(30)
SEARCH_CONDITION LONG
R_OWNER VARCHAR2(30)
R_CONSTRAINT_NAME VARCHAR2(30)
DELETE_RULE VARCHAR2(9)
STATUS VARCHAR2(8)
DEFERRABLE VARCHAR2(14)
DEFERRED VARCHAR2(9)
VALIDATED VARCHAR2(13)
GENERATED VARCHAR2(14)
BAD VARCHAR2(3)
RELY VARCHAR2(4)
LAST_CHANGE DATE
INDEX_OWNER VARCHAR2(30)
INDEX_NAME VARCHAR2(30)
INVALID VARCHAR2(7)
VIEW_RELATED VARCHAR2(14)
SQL> select constraint_name from user_constraints where table_name = ‘USERINFO_P1’;
**CONSTRAINT_NAME
——————————**
PK_ID_USERNAME
SQL> select constraint_name from user_constraints where table_name = ‘USERINFO_P’;
SYS_C0011106
**在修改表时添加主键约束
ADD CONSTRAINT constraint_name
PRIMARY KEY(column_name1,…);**
SQL> desc userinfo
名称 是否为空? 类型
ID NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
EMAIL VARCHAR2(30)
REGDATE DATE
SQL> alter table userinfo
2 add constraint pk_id primary key(id);
表已更改。
SQL> desc userinfo;
名称 是否为空? 类型
ID NOT NULL NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
EMAIL VARCHAR2(30)
REGDATE DATE
更改约束名称
**RENAME CONSTRAINT old_name
TO new_name**
SQL> alter table userinfo
2 rename constraint pk_id to new_pk_id;
表已更改。
SQL> select constraint_name from user_constraints where table_name = ‘USERINFO’;
NEW_PK_ID
**删除主键约束
DISABLE|ENABLE CONSTRAINT constraint_name;**
SQL> alter table userinfo
2 disable constraint new_pk_id;
表已更改。
SQL> select constraint_name,status from user_constraints where table_name = ‘USERINFO’;
CONSTRAINT_NAME STATUS
NEW_PK_ID DISABLED
DROP CONSTRAINT constraint_name;
SQL> alter table userinfo
2 drop constraint new_pk_id;
表已更改。
SQL> select constraint_name from user_constraints where table_name = ‘USERINFO’;
未选定行
DROP PRIMARY KEY[CASCADE]
SQL> desc userinfo_p
名称 是否为空? 类型
ID NOT NULL NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
SQL> alter table userinfo_p
2 drop primary key;
表已更改。
SQL> desc userinfo_p
名称 是否为空? 类型
ID NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
在创建表时添加外键约束(列级)
**在创建表时设置外键约束
table1 从表
REFERENCES table2(column_name,…);
主表
设置外键约束时,主表字段必须是主键。**
SQL> create table typeinfo(
2 typeid varchar2(20) primary key,
3 typename varchar2(20));
表已创建。
SQL> create table userinfo_f(
2 id varchar2(10) primary key,
3 username varchar2(20),
4 typeid_new varchar2(10) references typeinfo(typeid));
表已创建。
SQL> insert into typeinfo
2 values(1,1);
已创建 1 行。
SQL> insert into userinfo_f
2 (id,typeid_new)values(1,2);
insert into userinfo_f
*
第 1 行出现错误:
ORA-02291: 违反完整约束条件 (SYSTEM.SYS_C0011111) - 未找到父项关键字
SQL> insert into userinfo_f
2 (id,typeid_new)values(1,1);
已创建 1 行。
SQL> insert into userinfo_f
2 (id,typeid_new)values(2,null);
已创建 1 行。
SQL> select * from userinfo_f;
ID USERNAME TYPEID_NEW
1 1
2
**5 在创建表时设置外键约束(表级)
CONSTRAINT constraint_name FOREIGN
KEY(column_name)REFERENCES
table_name(column_name)[ON DELETE CASCADE]**
SQL> create table userinfo_f2(
2 id varchar2(10) primary key,
3 username varchar2(20),
4 typeid_new varchar2(10),
5 constraint fk_typeid_new foreign key(typeid_new)
6 references typeinfo(typeid));
表已创建。
SQL> create table userinfo_f3(
2 id varchar2(10) primary key,
3 username varchar2(20),
4 typeid_new varchar2(10),
5 constraint fk_typeid_new foreign key(typeid_new)
6 references typeinfo(typeid) on delete cascade);
constraint fk_typeid_new foreign key(typeid_new)
*
第 5 行出现错误:
ORA-02264: 名称已被一现有约束条件占用
SQL> create table userinfo_f3(
2 id varchar2(10) primary key,
3 username varchar2(20),
4 typeid_new varchar2(10),
5 constraint fk_typeid_new1 foreign key(typeid_new)
6 references typeinfo(typeid) on delete cascade);
表已创建。
**7 在修改表时添加外键约束
ADD CONSTRAINT constraint_name FOREIGN KRY(column_name)
references table_name(column_name)[ON DELETE CASCADE]**
create table userinfo_f4(
id varchar2(10) primary key,
username varchar2(20),
typeid_new varchar2(10));
**8 删除外键约束
DISABLE|ENABLE CONSTRAINT constraint_name;**
SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_F4’;
CONSTRAINT_NAME C STATUS
SYS_C0011117 P ENABLED
FK_TYPEID_ALTER R ENABLED
SQL> alter table userinfo_f4 disable constraint fk_typeid_alter;
表已更改。
SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_F4’;
CONSTRAINT_NAME C STATUS
SYS_C0011117 P ENABLED
FK_TYPEID_ALTER R DISABLED
**彻底删除
DROP CONSTRAINT constraint_name;**
SQL> alter table userinfo_f4 drop constraint fk_typeid_alter;
表已更改。
SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_F4’;
CONSTRAINT_NAME C STATUS
SYS_C0011117 P ENABLED
**9 唯一约束
保证字段值唯一性
唯一和主键约束区别
唯一约束允许有空值
且可以有多个唯一约束
在创建表时设置唯一约束**
UNIQUE(列级)
SQL> create table userinfo_u(
2 id varchar2(10) primary key,
3 username varchar2(10) unique,
4 userpwd varchar2(20));
表已创建。
**表级
CONSTRAINT constraint_name UNIQUE(column_name);
(若设置多个,需要写多个子句,而不是在unique后写多个字段)**
SQL> create table userinfo_u1(
2 id varchar2(10) primary key,
3 username varchar2(10),
4 userpwd varchar2(20),
5 CONSTRAINT un_username unique(username));
表已创建。
**10 在修改表时添加唯一约束
ADD CONSTRAINT constraint_name UNIQUE(column_name);**
create table userinfo_u2(
id varchar2(10) primary key,
username varchar2(10),
userpwd varchar2(20));
**11 删除唯一约束
DISABLE|ENABLE CONSTRAINT constraint_name
DROP CONSTRAINT constraint_name;**
SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_U2’;
CONSTRAINT_NAME C STATUS
SYS_C0011125 P ENABLED
UN_USERNAME1 U ENABLED
SQL> alter table userinfo_u2 disable constraint un_username1;
表已更改。
SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_U2’;
CONSTRAINT_NAME C STATUS
SYS_C0011125 P ENABLED
UN_USERNAME1 U DISABLED
SQL> alter table userinfo_u2 enable constraint un_username1;
表已更改。
SQL> alter table userinfo_u2 drop constraint un_username1;
表已更改。
SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_U2’;
CONSTRAINT_NAME C STATUS
SYS_C0011125 P ENABLED
**12 在创建表时设置检查约束
在创建表时设置检查约束
允许多个
列级
CHECK(expressions)**
create table userinfo_c(
id varchar2(10) primary key,
username varchar2(10),
salary number(5) check(salary > 0));
SQL> insert into userinfo_c values(1,’aaa’,-50);
insert into userinfo_c values(1,’aaa’,-50)
*
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SYSTEM.SYS_C0011127)
**表级
CONSTRAINT constraint_name check(expressions)**
create table userinfo_c1(
id varchar2(10) primary key,
username varchar2(10),
salary number(5),
CONSTRAINT ck_salary check(salary > 0));
**13 修改表时添加检查约束
ADD CONSTRAINT constraint_name check(expressions);**
create table userinfo_c2(
id varchar2(10) primary key,
username varchar2(10),
salary number(5));
SQL> create table userinfo_c2(
2 id varchar2(10) primary key,
3 username varchar2(10),
4 salary number(5));
表已创建。
SQL> alter table userinfo_c2 add constraint ck_salary_new check(salary > 0);
表已更改。
14 删除检查约束
SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_C2’;
CONSTRAINT_NAME C STATUS
SYS_C0011131 P ENABLED
CK_SALARY_NEW C ENABLED
SQL> alter table userinfo_c2 disable constraint ck_salary_new;
表已更改。
SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_C2’;
CONSTRAINT_NAME C STATUS
SYS_C0011131 P ENABLED
CK_SALARY_NEW C DISABLED
SQL> alter table userinfo_c2 enable constraint ck_salary_new;
表已更改。
SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_C2’;
CONSTRAINT_NAME C STATUS
SYS_C0011131 P ENABLED
CK_SALARY_NEW C ENABLED
SQL> alter table userinfo_c2 drop constraint ck_salary_new;
表已更改。
SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_C2’;
CONSTRAINT_NAME C STATUS
SYS_C0011131 P ENABLED
15 约束小结
非空
主键
外键
唯一
检查
在创建表时创建约束
非空只在表级 无名字
在修改表时添加约束
非空 modify
更改约束名称
非空不能改
数据字典 user_constraints
RENAME CONSTRAINT old_name TO new_name
删除约束
非空 MODIFY
其他 DISABLE DROP