oracle的约束的分类创建和修改

来源:互联网 发布:波士顿矩阵分析案例 编辑:程序博客网 时间:2024/06/12 00:24
三、约束
(一)什么是约束
Oracle中,数据完整性可以使用约束、触发器、应用程序(过程、函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性能,所以作为维护数据完整性的首选。
列级约束:
列级定义是在定义列的同时定义约束;
column [CONSTRAINT constraint_name] constraint_type
表级约束:
表级定义是指在定义了所有列后,再定义约束,这里需要注意,not null约束只能在列级上定义;
column ,...,
[CONSTRAINT constraint_name] constraint_type (column,...)
 
(二)约束的分类
1  not null(非空)
如果在列上定义了not null,那么当插入数据时,必须为列提供,数据不能为NULL。约束只能在列级定义,不能在表级定义。
2  unique(唯一)
当定义了唯一约束后,该列值是不能重复的,但是可以为null
3  primary key(主键)
用于唯一的标识表行的数据,当定义主键约束后,该列不但不能重复而且不能为NULL。一张表最多只能有一个主键,但是可以由多个unique约束。
创建主键或唯一约束后,ORACLE会自动创建一个与约束同名的索引(UNIQUENESUNIQUE唯一索引)。需要注意的是:每个表只能有且有一个主键约束。
4  foreign key(外键)
用于定义主表和从表之间的关系,外键约束要定义在从表上,主要则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为NULL
用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性外键约束是个有争议性的约束,它一方面能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另外一方面它会增加表插入、更新等SQL性能的额外开销,不少系统里面通过业务逻辑控制来取消外键约束。例如在数据仓库中,就推荐禁用外键约束。
5  check
用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在10002000之间,如果不在10002000之间就会提示出错。
 
(三)约束的创建
1 not null(非空)
方法一:
SQL> create table t1(id number,name varchar2(20) constraint nn_t1_id not null);
 
SQL> select constraint_name,constraint_type,owner from user_constraints;
CONSTRAINT_NAME        C    OWNER
------------------------------ - ----------
NN_T1_ID                 C    SCOTT
 
方法二:
SQL> drop table t1 purge;
SQL> create table t1(id number,name varchar2(20));
SQL> alter table t1 modify id constraint nn_t1_id not null;
SQL> select constraint_name,table_name,owner from user_constraints;
CONSTRAINT_NAME          TABLE_NAME                   OWNER
------------------------------ ------------------------------ ----------
NN_T1_ID                 T1                             SCOTT
 
2 unique(唯一)
方法一:
SQL> create table t1(id number,qq number,constraint un_t1_qq unique(qq));
方法二:
SQL> alter table t1 add constraint un_t1_qq unique(qq);
 
3  primary key(主键)
方法一:
SQL> create table t1(id number,qq number,constraint pk_t1_id primary key(id));
方法二:
SQL> alter table t1 add constraint pk_t1_id primary key(id);
SQL> select constraint_name,table_name,owner from user_constraints;
CONSTRAINT_NAME          TABLE_NAME                   OWNER
------------------------------ ------------------------------ ----------
PK_T1_ID                    T1                           SCOTT
 
4  foreign key(外键)
方法一:
SQL> create table t2(id number,cc number,constraint fk_t2_id foreign key(id) references t1(id));
方法二:
SQL> alter table t1 add constraint pk_t2_id foreign key(id) references t1(id);
SQL> select constraint_name,table_name,owner from user_constraints;
CONSTRAINT_NAME          TABLE_NAME                   OWNER
------------------------------ ------------------------------ ----------
PK_T1_ID                 T1                             SCOTT
PK_T2_ID                 T1                             SCOTT
 
当定义了外部键约束之后,要求外部键列的数据必须在主表的主键列(或惟一列)中存在,或者为NULL,FOREING KEY约束既可以在列级定义,也可以在表级定义。
 
关键字说明:
(1)  FOREING KEY:该选项用于指定在表级定义外部键约束。当在表级定义外部键约束时必须指定该选项,在列级定义外部键约束不需要指定该选项
(2)  REFERENCES:该选项用于指定主表名及其主键列。当定义外部键约束时,该选项必须指定。
(3)  ON DELETE CASCAED:该选项用于指定级联删除选项。如果在定义外部键约束时指定了该选项,那么当删除主表数据时会级联删除从表的相关数据。
(4)  ON DELECT SET NULL:该选项用于指定转换相关的外部键值为NULL,如果在定义外部键约束时指定了该选项,那么当删除主表数据时会将从表外部键列的数据设置为NULL
SQL> create table t1(id number,qq number,constraint pk_t1_id primary key(id));
SQL> create table t2(id number,sal number,constraint fk_t2_id foreign key(id) references t1(id));
 
SQL> delete t1; ----由于主外键约束,无法删除主表
delete t1
*
ERROR at line 1:
ORA-02292: integrity constraint (SYS.FK_T2_ID) violated - child record found
 
SQL> insert into t2 values(2,2); ---由于主外键的约束,无法在外键表插入主键中id列没有的值
insert into t2 values(2,2)
*
ERROR at line 1:
ORA-02291: integrity constraint (SYS.FK_T2_ID) violated - parent key not found
 
SQL> delete t2;
1 row deleted.
 
SQL> rollback;
 
SQL> drop table t2 purge;
SQL> create table t2(id number,sal number,constraint fk_t2_id foreign key(id) references t1(id) on delete cascade);  -----外键表添加级联删除参数
 
SQL> delete t1;   ----删除主键表上的数据,级联删除外键表上的数据
1 row deleted.
 
SQL> select * from t1;
no rows selected
 
SQL> select * from t2;
no rows selected
 
5  check(检查性约束)
方法一:
SQL> create table t3(id number,sal number,constraint ck_t3_sal check(sal between 5000 and 50000));
SQL> select constraint_name,table_name,owner from user_constraints;
 
CONSTRAINT_NAME          TABLE_NAME                   OWNER
------------------------------ ------------------------------                    ----------
CK_T3_SAL                T3                              SCOTT
方法二:
SQL> create table t3(id number,sal number);
SQL> alter table t3 add constraint ck_t3_sal check(sal>5000);
 
(四)约束的维护
增加约束
1) 如果增加UNIQUEPRIMARY KEYFOREIGN KEY CKECK 必须使用ALTER TABLE语句的ADD子句;
2) 如果增加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;
 
修改约束名
在同一个方案中,约束名必须惟一,并且约束名也不能与其他对象同名。当用IMPDP工具或者IMP工具导入其他对象时,如发现有同名的对象,将会出错
语法:
ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name
TO new_constraint_name;
例:
ALTER TABLE emp01 RENAME CONSTRAINT SYS_C005028
TO ck_emp01_salary;
 
SQL> alter table t1 rename constraint PK_T1_ID to new pk01_t1_id;
alter table t1 rename constraint PK_T1_ID to new pk01_t1_id
*
ERROR at line 1:  --------主键无法更改名字
ORA-23290: This operation may not be combined with any other operation
 
SQL> alter table t2 rename constraint fk_t2_id to fk01_t2_id;
SQL> select constraint_name,table_name from user_constraints where table_name='T2';
 
CONSTRAINT_NAME                TABLE_NAME
------------------------------ ------------------------------
FK01_T2_ID                     T2   -------------外键可以更改名字
 
SQL> alter table t1 add constraint un_t1_qq unique(qq);
 
SQL> select constraint_name,table_name from user_constraints where table_name='T1';
 
CONSTRAINT_NAME                TABLE_NAME
------------------------------ ------------------------------
PK_T1_ID                       T1
UN_T1_QQ                       T1
 
SQL> alter table t1 rename constraint un_t1_qq to un01_t1_qq;
 
SQL> select constraint_name,table_name from user_constraints where table_name='T1';
 
CONSTRAINT_NAME                TABLE_NAME
------------------------------ ------------------------------
PK_T1_ID                       T1
UN01_T1_QQ                     T1
 
禁止约束
 
禁止约束指使约束临时失效。当禁止了约束之后,约束规则将不再生效。在使用SQL*LOADERINSERT装载数据之前,为了加快数据装载速度,应该首先禁止约束,然后装载数据。
语法:
ALTER TABLE table_name
DISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用于指定级联禁止从表的外部键
SQL> insert into t2 values(2,2);
insert into t2 values(2,2)
*
ERROR at line 1:
ORA-02291: integrity constraint (SYS.FK01_T2_ID) violated - parent key not
found
 
SQL> alter table t2 disable constraint fk01_t2_id;
Table altered.
 
SQL> insert into t2 values(2,2);
1 row created.
 
激活约束
 
语法:
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
例:
SQL> alter table t2 enable constraint fk01_t2_id;
alter table t2 enable constraint fk01_t2_id
                                 *
ERROR at line 1:   ---外键激活失败,原因是在外键表中含有主键表中没有的数据
ORA-02298: cannot validate (SYS.FK01_T2_ID) - parent keys not found
 
SQL> delete t2 where id=2;   -------删除数据
 
SQL> alter table t2 enable constraint fk01_t2_id;  ----激活成功
 
删除约束
 
当删除特定表的主键约束时,如果该表具有相关的从表,那么在删除主键约束时必须带有CASCAED选项
语法:
ALTER TABLE table_name DROP
CONSTRAINT constraint_name |PRIMARY KEY
例一:(删除唯一性约束)
SQL> select constraint_name,table_name from user_constraints where table_name='T1';
 
CONSTRAINT_NAME                TABLE_NAME
------------------------------ ------------------------------
PK_T1_ID                       T1
UN01_T1_QQ                     T1
 
SQL> alter table t1 drop constraint un01_t1_qq;
 
Table altered.
 
SQL> select constraint_name,table_name from user_constraints where table_name='T1';
 
CONSTRAINT_NAME                TABLE_NAME
------------------------------ ------------------------------
PK_T1_ID                       T1
 
例二:(删除主键约束,级联删除外键约束)
SQL> alter table t1 drop primary key cascade;
 
Table altered.
 
SQL> select constraint_name,table_name from user_constraints where table_name='T2';
 
no rows selected
 
SQL> select constraint_name,table_name from user_constraints where table_name='T1';
 
no rows selected
 
显示信息
 
1.USER_CONSTRAINTS
2.USER_CONS_COLUMNS
 
SQL> select constraint_name,table_name,column_name from user_cons_columns where table_name='T1';
 
CONSTRAINT_NAME             TABLE_NAME                     COLUM
------------------------------       ------------------------------                   -----
UN_T1_ID                          T1                           ID
原创粉丝点击