约束是对表加的一些强制性规定
ORACLE中约束有以下几种类型:
NOT NULL 非空约束 C
UNIQUE 唯一约束 U
PRIMARY KEY 主键约束 P
FOREIGN KEY 外键约束 R
CHECK 条件约束 C
创建约束:
非空约束
建表时指定:
SQL> create table c1
(id number(5) not null, //系统命名的约束
name varchar2(20));
SQL> create table c2
(id number(5) constraint nu not null, //用户命名的约束
name varchar2(20));
表建好后添加:
SQL> alter table c1 modify (id number(5) constraint c1_id_nu not null);
查询约束:
SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,SEARCH_CONDITION
from dba_constraints where table_name in ('C1','C2');
唯一约束
唯一约束就是该列上值必须唯一,不能有重复值(但可以有多个空值)
建表时指定:
SQL> create table c3
(id number(5) constraint c3_id_uq unique,
name varchar2(20)
);
表建好后添加:
SQL> alter table c3 add constraint c3_id_uq unique (id);
定义一个唯一约束后,会在该列上创建一个唯一性索引,如果之前有索引,就用原来的索引
主键约束
主键约束,效果上看相当于非空约束+唯一约束
SQL> create table c4
(id number(5) constraint c4_id_pk primary key,
name varchar2(20));
SQL> alter table c4 drop constraint c4_id_pk;
SQL> alter table c4 add constraint c4_id_pk primary key (id);
条件约束
条件约束就是定义字段上的值必须符合某个要求
SQL> create table c5
(id number(5) constraint c5_id_ck check (id>10),
name varchar2(20));
外键约束
约束约束是针对两个表的,通过一张表(父表)来约束另一张表(子表)
定义外键约束时,父表字段上要有主键约束或唯一约束,子表建外键约束
例:
SQL> create table p as select * from scott.dept; 建立父表
SQL> create table c as select * from scott.emp; 建立子表
SQL> alter table p add constraint p_deptno_pk primary key (deptno);
父表定义主键
SQL> alter table c add constraint c_deptno_fk foreign key(deptno)
references p(deptno);
子表定义外键
外键约束对DML的影响:
对 insert 的影响
发生在子表上,如果父表中不存在的外键值,就不允许插
对 update 的影响
父表和子表都有影响,
子表修改后的值必须在父表上能找到
父表的值如果表子表引用了,不能修改
对 delete 的影响
发生父表上,如果父表的值如果表子表引用了,不能删除的
on delete set null 和 on delete cascade
这两个语句放在建外键约束时:
SQL> alter table c add constraint c_deptno_fk foreign key(deptno)
references p(deptno) on delete set null;
on delete set null 父表删除记录时,子表相应值设置为空
on delete cascade 父表删除记录时,子表跟前删除
删除约束
ALTER TABLE ... DROP CONSTRAINT ...
SQL> alter table c drop constraint c_deptno_fk;
禁用约束:
ALTER TABLE ... DISABLE CONSTRAINT ...
SQL> alter table c disable constraint c_deptno_fk;
这样就没有删除,以后想要的时候,还可再次启用
启用约束:
ALTER TABLE ... ENABLE CONSTRAINT ...
SQL> alter table c enable constraint c_deptno_fk;
修改约束状态:
disable / enable 控制对新插入的数据是否实施约束
validate / novalidate 控制对已存在的数据是否实施约束
默认启用就是: enable validate
禁用: disable novalidate
如果将状态设置为: DISABLE VALIDATE 将会禁止对表DML操作
SQL> ALTER TABLE SCOTT.C MODIFY CONSTRAINT c_deptno_fk ENABLE NOVALIDATE;
查看约束
dba_constraints
SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS,INVALID
from dba_constraints where table_name IN ('T2','EMP','DEPT');
ORACLE中约束有以下几种类型:
NOT NULL 非空约束 C
UNIQUE 唯一约束 U
PRIMARY KEY 主键约束 P
FOREIGN KEY 外键约束 R
CHECK 条件约束 C
创建约束:
非空约束
建表时指定:
SQL> create table c1
(id number(5) not null, //系统命名的约束
name varchar2(20));
SQL> create table c2
(id number(5) constraint nu not null, //用户命名的约束
name varchar2(20));
表建好后添加:
SQL> alter table c1 modify (id number(5) constraint c1_id_nu not null);
查询约束:
SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,SEARCH_CONDITION
from dba_constraints where table_name in ('C1','C2');
唯一约束
唯一约束就是该列上值必须唯一,不能有重复值(但可以有多个空值)
建表时指定:
SQL> create table c3
(id number(5) constraint c3_id_uq unique,
name varchar2(20)
);
表建好后添加:
SQL> alter table c3 add constraint c3_id_uq unique (id);
定义一个唯一约束后,会在该列上创建一个唯一性索引,如果之前有索引,就用原来的索引
主键约束
主键约束,效果上看相当于非空约束+唯一约束
SQL> create table c4
(id number(5) constraint c4_id_pk primary key,
name varchar2(20));
SQL> alter table c4 drop constraint c4_id_pk;
SQL> alter table c4 add constraint c4_id_pk primary key (id);
条件约束
条件约束就是定义字段上的值必须符合某个要求
SQL> create table c5
(id number(5) constraint c5_id_ck check (id>10),
name varchar2(20));
外键约束
约束约束是针对两个表的,通过一张表(父表)来约束另一张表(子表)
定义外键约束时,父表字段上要有主键约束或唯一约束,子表建外键约束
例:
SQL> create table p as select * from scott.dept; 建立父表
SQL> create table c as select * from scott.emp; 建立子表
SQL> alter table p add constraint p_deptno_pk primary key (deptno);
父表定义主键
SQL> alter table c add constraint c_deptno_fk foreign key(deptno)
references p(deptno);
子表定义外键
外键约束对DML的影响:
对 insert 的影响
发生在子表上,如果父表中不存在的外键值,就不允许插
对 update 的影响
父表和子表都有影响,
子表修改后的值必须在父表上能找到
父表的值如果表子表引用了,不能修改
对 delete 的影响
发生父表上,如果父表的值如果表子表引用了,不能删除的
on delete set null 和 on delete cascade
这两个语句放在建外键约束时:
SQL> alter table c add constraint c_deptno_fk foreign key(deptno)
references p(deptno) on delete set null;
on delete set null 父表删除记录时,子表相应值设置为空
on delete cascade 父表删除记录时,子表跟前删除
删除约束
ALTER TABLE ... DROP CONSTRAINT ...
SQL> alter table c drop constraint c_deptno_fk;
禁用约束:
ALTER TABLE ... DISABLE CONSTRAINT ...
SQL> alter table c disable constraint c_deptno_fk;
这样就没有删除,以后想要的时候,还可再次启用
启用约束:
ALTER TABLE ... ENABLE CONSTRAINT ...
SQL> alter table c enable constraint c_deptno_fk;
修改约束状态:
disable / enable 控制对新插入的数据是否实施约束
validate / novalidate 控制对已存在的数据是否实施约束
默认启用就是: enable validate
禁用: disable novalidate
如果将状态设置为: DISABLE VALIDATE 将会禁止对表DML操作
SQL> ALTER TABLE SCOTT.C MODIFY CONSTRAINT c_deptno_fk ENABLE NOVALIDATE;
查看约束
dba_constraints
SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS,INVALID
from dba_constraints where table_name IN ('T2','EMP','DEPT');
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21175589/viewspace-755640/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21175589/viewspace-755640/