约束简介约束用于确保数据库数据满足特定的商业逻辑或者企业规则,如果定义了约束,并且数据不符
合约束,那么DML操作(INSERT、UPDATE、DELETE)将不能成功执行。约束包括NOT NULL、UNIQUE、PRIMARY KEY、FOREING KEY 以及CHECK等五种类型
定义约束列级约束:column [CONSTRAINT constraint_name] constraint_type表级约束:column ,...,[CONSTRAINT constraint_name] constraint_type (column,...)
1.定义NOT NULL约束NOT NULL 约束只能在列级定义,不能在表级定义例:CREATE TABLE emp01(eno INT NOT NULL,name VARCHAR2(10) CONSTRAINT nn_name2 NOT NULL,salary NUMBER(6,2));上例中,eno列与name列上定义了NOT NULL约束,其中eno列的NOT NULL约束没有指定约束名,而
name列则指定了约束名nn_name。可以通过查询user_constraints字典来查看所定义的约束,如:SQL> select constraint_name,constraint_type from user_constraints2 where table_name='EMP01';
CONSTRAINT_NAME CO------------------------------------------------------------ --SYS_C0010618 CNN_NAME C可见,没有给约束名的,系统将会自动的定义一个约束名称,其中约束类型中,P:表示主键,R:
表示外键,C表示NOT NULL或CHECK,U表示UNIQUE。且系统中同一方案下的的约束名不能重复
2.定义UNIQUE约束定义了惟一约束之后,惟一约束列的列值不能重复,但可以为NULL。UNIQUE约束既可以在列级
定义,也可以在表级定义例:CREATE TABLE emp02(eno INT UNIQUE,name VARCHAR2(10) CONSTRAINT u_name UNIQUE,salary NUMBER(6,2));同样,如果没有给出约束名,系统会自动定义一个名称,可从查询结果得出SQL> select constraint_name,constraint_type from user_constraints2 where table_name='EMP02';
CONSTRAINT_NAME CO------------------------------------------------------------ --SYS_C0010623 UU_NAMEU
3.定义PRIMARY KEY 约束当定义主键约束后,主键约束列的列值不仅不能重复,而且也不能为NULL。主键约束既可以在
列级定义,也可以在表级定义。一张表最多只能具有一个主键约束,当一个表中的多个列都要为
主键是,可以在表级定义。例1:列级定义主键CREATE TABLE depto04(dno INT PRIMARY KEY,dname VARCHAR2(10),loc VARCHAR2(20));通过查询user_constraints可得出SQL> select constraint_name ,constraint_type from user_constraints2 where table_name='DEPT04';
CONSTRAINT_NAME CO------------------------------------------------------------ --SYS_C0010625 P通过查询user_cons_columns可得出SQL> select constraint_name,column_name from user_cons_columns2 where table_name='DEPT04';
CONSTRAINT_NAME COLUMN_NAME------------------------------------------------------------ ------------
SYS_C0010625 DNO例2:表级定义主键CREATE TABLE dept05(dno INT,dname VARCHAR2(10),loc VARCHAR2(20),PRIMARY KEY(dno,dname));通过查询user_constraints可以得出SQL> select constraint_name,constraint_type from user_constraints2 where table_name='DEPT05';
CONSTRAINT_NAME CO------------------------------------------------------------ --SYS_C0010626 P通过查询user_cons_columns可得出SQL> select constraint_name,column_name from user_cons_columns2 where table_name='DEPT05';
CONSTRAINT_NAME COLUMN_NAME------------------------------------------------------------ -------------
SYS_C0010626 DNOSYS_C0010626 DNAME可见,当在表级定义时,约束名称将会相同,而在user_cons_columns查询是,每一列将对应约束
名称相同的两条记录
4.定义FOREING KEY约束当定义了外部键约束之后,要求外部键列的数据必须在主表的主键列(或惟一列)中存在,或
者为NULL,FOREING KEY约束既可以在列级定义,也可以在表级定义。关键字说明:FOREING KEY:该选项用于指定在表级定义外部键约束。当在表级定义外部键约束时必须指定该选
项,在列级定义外部键约束不需要指定该选项REFERENCES:该选项用于指定主表名及其主键列。当定义外部键约束时,该选项必须指定。ON DELETE CASCAED:该选项用于指定级联删除选项。如果在定义外部键约束时指定了该选项,那
么当删除主表数据时会级联删除从表的相关数据。ON DELECT SET NULL:该选项用于指定转换相关的外部键值为NULL,如果在定义外部键约束时指定
了该选项,那么当删除主表数据时会将从表外部键列的数据设置为NULL。例1:列级定义外键约束CREATE TABLE emp04(eno INT,name VARCHAR2(10),salary NUMBER(6,2),dno INT CONSTRAINT fk_dno REFERENCES dept04(dno));SQL> select constraint_name,constraint_type from user_constraints2 where table_name='EMP04';
CONSTRAINT_NAME CO------------------------------------------------------------ --FK_DNO RSQL> select constraint_name,column_name from user_cons_columns2 where table_name='EMP04';
CONSTRAINT_NAME COLUMN_NAME------------------------------------------------------------ -----------
FK_DNO DNO例2:表级定义外键约束CREATE TABLE emp05(eno INT,name VARCHAR2(10),salary NUMBER(6,2),dno INT,CONSTRAINT fk_dno_name FOREIGN KEY(dno,name) REFERENCES dept05(dno,dname));SQL> select constraint_name,constraint_type from user_constraints2 where table_name='EMP05'3 ;
CONSTRAINT_NAME CO------------------------------------------------------------ --FK_DNO_NAME RSQL> select constraint_name,column_name from user_cons_columns2 where table_name='EMP05';
CONSTRAINT_NAME COLUMN_NAME------------------------------------------------------------ -----------
FK_DNO_NAME DNOFK_DNO_NAME NAME
5.定义CHECK约束CHECK约束既可以在列级定义,也可以在表级定义。CHECK约束允许列为NULL。例:CREATE TABLE emp06(eno INT,name VARCHAR2(10),salary NUMBER(6,2),CHECK (salary BETWEEN 1000 AND 5000));SQL> select constraint_name,constraint_type from user_constraints2 where table_name='EMP06';
CONSTRAINT_NAME CO------------------------------------------------------------ --SYS_C0010629 CSQL> select constraint_name,column_name from user_cons_columns2 where table_name='EMP06';
CONSTRAINT_NAME COLUMN_NAME------------------------------------------------------------ -----------
SYS_C0010629 SALARY
6.定义复合约束复合约束即在表级定义,基于多列的复合约束,如:CREATE TABLE dept05(dno INT,dname VARCHAR2(10),loc VARCHAR2(20),PRIMARY KEY(dno,dname));或CREATE TABLE emp05(eno INT,name VARCHAR2(10),salary NUMBER(6,2),dno INT,CONSTRAINT fk_dno_name FOREIGN KEY(dno,name) REFERENCES dept05(dno,dname));
9.3维护约束9.3.1增加约束如果增加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必须使用ALTER TABLE语句的ADD子句;
如果增加NOT NULL约束,那么必须使用ALTER TABLE语句的MODIFY子句,如:ALTER TABLE table_name ADD [CONSTRAINT constraint_name]constraint_type (column,...)ALTER TABLE table_name MODIFY column[CONSTRAINT constraint_name] NOT NULL;9.3.2修改约束名在同一个方案中,约束名必须惟一,并且约束名也不能与其他对象同名。当鱫IMPDP工具或者IMP
工具导入其他对象时,如发现有同名的对象,将会出错语法:ALTER TABLE table_name RENAME CONSTRAINT old_constraint_nameTO new_constraint_name;例:ALTER TABLE emp01 RENAME CONSTRAINT SYS_C005028TO ck_emp01_salary;9.3.3 删除约束当删除特定表的主键约束时,如果该表具有相关的从表,那么在删除主键约束
时必须带有CASCAED选项语法:ALTER TABLE table_name DROPCONSTRAINT constraint_name |PRIMARY KEY例1ALTER TABLE emp01 DROP CONSTRAINT ck_emp01_salary;例2ALTER TABLE dept01 DROP PRIMARY KEY CASCAED9.3.4禁止约束禁止约束指使约束临时失效。当禁止了约束之后,约束规则将不再生效。在使用SQL*LOADER或
INSERT装载数据之前,为了加快数据装载速度,应该首先禁止约束,然后装载数据。语法:ALTER TABLE table_nameDISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用于指定级联禁止从表的外部键
约束例:ALTER TABLE emp05 DISABLE CONSTAINT SYS_C00502;9.3.5 激活约束语法:ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;例:ALTER TABLE emp05 ENABLE CONSTRAINT SYS_C005022;9.4 显示约束信息1.USER_CONSTRAINTS2.USER_CONS_COLUMNS