Oracle的约束
一、简介
二、非空约束
1、在创建表时设置非空约束
- create table 表名(列名 数据类型 not null,…);
SQL> create table userinfo_1 (id number(6,0), 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) values(1);
insert into userinfo_1(id) values(1)
*
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SYSTEM"."USERINFO_1"."USERNAME")
SQL> insert into userinfo_1(id,username,userpwd) values(1,'jack','123123');
已创建 1 行。
SQL> select * from userinfo_1;
ID USERNAME USERPWD
1 jack 123123
2、在修改表时添加非空约束
- alter table 表名 modify 列名 数据类型 not null;
SQL> alter table userinfo modify username varchar2(20) not null;
alter table userinfo modify username varchar2(20) not null
*
第 1 行出现错误:
ORA-02296: 无法启用 (SYSTEM.) - 找到空值
SQL> delete from userinfo;
已删除3行。
SQL> alter table userinfo 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
3、在修改表时去除非空约束
- alter table 表名 modify 列名 数据类型 null;
SQL> alter table userinfo modify username varchar2(20) null;
表已更改。
SQL> desc userinfo
名称 是否为空? 类型
ID NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
EMAIL VARCHAR2(30)
REGDATE DATE
三、主键约束
1、简介
- 一张表只能设计一个主键约束
- 主键约束可以由多个字段构成(联合主键或复合主键)
2、在创建表时设置主键约束
- create table 表名(列名 数据类型 primary key,…);
SQL> create table userinfo_p (id number(6,0) primary key, username varchar2(20), userpwd varchar2(20));
表已创建。
SQL> desc userinfo_p;
名称 是否为空? 类型
ID NOT NULL NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
- create table 表名(列名1 数据类型1,constraint 主键约束名 primary key(列名1,…);
SQL> create table userinfo_p1 (id number(6,0), username varchar2(20), userpwd varchar2(20), 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';
CONSTRAINT_NAME
SYS_C0011161
3、在修改表时添加主键约束
- alter table 表名 add constraint 主键约束名 primary key(列名1,…);
SQL> alter table userinfo add constraint pk_id primary key(id);
表已更改。
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';
CONSTRAINT_NAME
PK_ID
4、更改主键约束的名称
- alter table 表名 rename constraint 旧主键名 to 新主键名
SQL> alter table userinfo rename constraint pk_id to new_pk_id;
表已更改。
SQL> select constraint_name from user_constraints where table_name='USERINFO';
CONSTRAINT_NAME
NEW_PK_ID
5、禁用主键约束
- alter table 表名 disable|enable constraint 主键名
SQL> alter table userinfo disable constraint new_pk_id;
表已更改。
SQL> select constraint_name,status from user_constraints where table_name='USERINFO';
CONSTRAINT_NAME STATUS
NEW_PK_ID DISABLED
6、删除主键约束
- alter table 表名 drop constaint 主键名
SQL> alter table userinfo drop constraint new_pk_id;
表已更改。
SQL> select constraint_name,status from user_constraints where table_name='USERINFO';
未选定行
四、外键约束
1、自动删除主键约束
- alter table 表名 drop primary key;
SQL> desc userinfo_p
名称 是否为空? 类型
ID NOT NULL NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
SQL> alter table userinfo_p drop primary key;
表已更改。
SQL> desc userinfo_p
名称 是否为空? 类型
ID NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
2、在创建表时设置外键约束
- create table 表名1(列名 数据类型 references 表名2(列名),…)
- 从表中外键字段的值必须来自主表中的相应字段的值,或者位null值
- table1从表,在创建表时设置外键约束
- table2主表,主从表中相应的字段必须时同一个数据类型
SQL> create table typeinfo (typeid varchar2(10) primary key, typename varchar2(20));
表已创建。
SQL> create table userinfo_f (id varchar2(10) primary key, username varchar2(20), typeid_new varchar2(10) references typeinfo(typeid));
表已创建。
SQL> insert into typeinfo values(1,1);
已创建 1 行。
SQL> insert into userinfo_f(id,typeid_new) values(1,2);
insert into userinfo_f(id,typeid_new) values(1,2)
*
第 1 行出现错误:
ORA-02291: 违反完整约束条件 (SYSTEM.SYS_C0011167) - 未找到父项关键字
SQL> insert into userinfo_f(id,typeid_new) values(1,1);
已创建 1 行。
SQL> insert into userinfo_f(id,typeid_new) values(2,null);
已创建 1 行。
- create table 表名 (字段名1 数据类型1, …, constraint 外键约束名 foreing key(列名) references 表名(列名) [on delete cascade];
SQL> create table userinfo_f2 (id varchar2(10) primary key, username varchar2(20), typeid_new varchar2(10),constraint fk_typeid_new foreign key(typeid_new)references typeinfo(typeid));
表已创建。
SQL> create table userinfo_f3 (id varchar2(10) primary key, username varchar2(20), typeid_new varchar2(10),constraint fk_typeid_new1 foreign key(typeid_new)references typeinfo(typeid) on delete cascade);
表已创建。
3、在修改表时添加外键约束
- create table 表名 add constraint 外键约束名 foreign key(列名) references 表名(列名) [on delete cascade];
SQL> create table userinfo_f4 (id varchar2(10) primary key, username varchar2(20), typeid_new varchar2(10));
表已创建。
SQL> alter table userinfo_f4 add constraint fk_typeid_alter foreign key(typeid_new) references typeinfo(typeid);
表已更改。
4、禁用外键约束
- disable|enable constraint 外键约束名;
SQL> select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_F4';
CONSTRAINT_NAME C STATUS
SYS_C0011172 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_C0011172 P ENABLED
FK_TYPEID_ALTER R DISABLED
5、删除外键约束
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_C0011172 P ENABLED
五、唯一约束
1、简介
- 唯一约束和主键约束的区别:
- 主键字段值必须是非空的
- 唯一约束允许有一个空值
- 主键在每张表中只能有一个
- 唯一约束在每张表中可以有多个
2、在创建表时设置唯一约束
- create table 表名 (字段名 数据类型 unique,…);
SQL> create table userinfo_u (id varchar2(10) primary key, username varchar2(20) unique, userpwd varchar2(20));
表已创建。
- create table 表名 (字段名1 数据类型1,… constraint 唯一约束名 unique(字段名));
SQL> create table userinfo_u1 (id varchar2(10) primary key, username varchar2(20), constraint un_username unique(username));
表已创建。
3、在修改表时添加唯一约束
- create table 表名 add constraint 唯一约束名 unique(字段名);
SQL> create table userinfo_u2 (id varchar2(10) primary key, username varchar2(20));
表已创建。
SQL> alter table userinfo_u2 add constraint un_username_new unique(username);
表已更改。
4、禁用唯一约束
- alter table 表名 disable|enable constraint 唯一约束名
SQL> alter table userinfo_u2 disable constraint UN_USERNAME_NEW;
表已更改。
SQL> select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_U2';
CONSTRAINT_NAME C STATUS
SYS_C0011178 P ENABLED
UN_USERNAME_NEW U DISABLED
5、删除唯一约束
- alter table 表名 drop constraint 唯一约束名;
SQL> alter table userinfo_u2 drop constraint UN_USERNAME_NEW;
表已更改。
六、检查约束
1、简介
2、在创建表时设置检查约束
- create table 表名 (字段名 数据类型 check(表达式), …);
SQL> create table userinfo_c (id varchar2(10) primary key, username varchar2(20), salary number(5,0) 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_C0011180)
SQL> insert into userinfo_c values(1,'aaa',50);
已创建 1 行。
- alter table 表名(字段名1 数据类型1, …, constraint 约束名 check(表达式));
SQL> create table userinfo_c1 (id varchar2(10) primary key, username varchar2(20), salary number(5,0), constraint ck_salary check(salary>0));
表已创建。
3、在修改表时添加检查约束
- alter table 表名 add constraint 约束名 check(表达式);
SQL> create table userinfo_3 (id varchar2(10) primary key, username varchar2(20), salary number(5,0));
表已创建。
SQL> alter table userinfo_3 add constraint ck_salary_new check(salary>0);
表已更改。
4、禁止检查约束
- disable|enable constraint 约束名
SQL> desc userinfo_3
名称 是否为空? 类型
ID NOT NULL VARCHAR2(10)
USERNAME VARCHAR2(20)
SALARY NUMBER(5)
SQL> select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_3';
CONSTRAINT_NAME C STATUS
SYS_C0011184 P ENABLED
CK_SALARY_NEW C ENABLED
SQL> alter table userinfo_3 disable constraint ck_salary_new;
表已更改。
SQL> select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_3';
CONSTRAINT_NAME C STATUS
SYS_C0011184 P ENABLED
CK_SALARY_NEW C DISABLED
5、删除检查约束
SQL> alter table userinfo_3 drop constraint ck_salary_new;
表已更改。
|