Oracle 约束详解

一 约束的定义数据库

约束是强加在表上的规则或条件。确保数据库知足业务规则。保证数据的完整性。当对表进行DML或DDL操做时,若是此操做会形成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操做。约束能够是列一级别的 也能够是表级别的。定义约束时没有给出约束的名字,ORACE系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为天然数(强烈建议各位在建立表或增长约束时,给约束定义名称。)
在Oracle中,数据完整性可使用约束、触发器、应用程序(过程、函数)三种方法来实现,在这三种方法中,由于约束易于维护,而且具备最好的性能,因此做为维护数据完整性的首选。
列级约束:
列级定义是在定义列的同时定义约束;
column [CONSTRAINT constraint_name] constraint_type
表级约束:
表级定义是指在定义了全部列后,再定义约束,这里须要注意,not null约束只能在列级上定义;
column ,...,
[CONSTRAINT constraint_name] constraint_type (column,...)ide

二 约束功能函数

约束的功能:实现一些业务规则,防止无效的垃圾数据进入数据库,维护数据库的完整性(完整性指正确性与一致性)。从而使数据库的开发和维护都更加容易。工具

三 约束的分类性能

1 not null(非空)
若是在列上定义了not null,那么当插入数据时,必须为列提供,数据不能为NULL。约束只能在列级定义,不能在表级定义。orm

2 unique(惟一)
当定义了惟一约束后,该列值是不能重复的,可是能够为null。
3 primary key(主键)
用于惟一的标识表行的数据,当定义主键约束后,该列不但不能重复并且不能为NULL。一张表最多只能有一个主键,可是能够由多个unique约束。
建立主键或惟一约束后,ORACLE会自动建立一个与约束同名的索引(UNIQUENES为UNIQUE惟一索引)。须要注意的是:每一个表只能有且有一个主键约束。
4 foreign key(外键)
用于定义主表和从表之间的关系,外键约束要定义在从表上,主要则必须具备主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为NULL。
用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性. 外键约束是个有争议性的约束,它一方面可以维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另一方面它会增长表插入、更新等SQL性能的额外开销,很多系统里面经过业务逻辑控制来取消外键约束。例如在数据仓库中,就推荐禁用外键约束。
5 check
用于强制行数据必须知足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,若是不在1000~2000之间就会提示出错。对象

四 约束命令规范索引

约束名称建议本身定义一套命名规则,不然使用系统生成的约束名,很难能把它和对应的表、字段联系起来。
    非空约束     NN_表名_列名
    惟一约束     UK_表名_列名
    主键约束     PK_表名
    外键约束     FK_表名_列名
    条件约束     CK_表名_列名
    默认约束     DF_表名_列名
若是约束名称超过32位长度,建议应该缩写表名,而不该用NN_表名_数字。不过具体视状况而定,不少时候 DF_表名_列名 这样命名,每每超出了32字符。因此有时候须要缩写表面或是采用其它规则。开发

五 建立约束
1 not null(非空)
建立
SQL> create table t1(id number,name varchar2(20) constraint nn_t1_id not null);it

Table created.
SQL> col CONSTRAINT_NAME format A50
SQL> col OWNER format A20
SQL> select constraint_name,constraint_type,owner from user_constraints;

CONSTRAINT_NAME C OWNER


SYS_C009047 V SCOTT
FK_DEPTNO R SCOTT
SYS_C009046 C SCOTT
NN_T1_ID C SCOTT
PK_DEPT P SCOTT
PK_EMP P SCOTT

6 rows selected.
修改
SQL> drop table t1 purge;

Table dropped.

SQL> create table t1(id number,name varchar2(20));

Table created.

SQL> alter table t1 modify id constraint nn_t1_id not null;

Table altered.

SQL> select constraint_name,constraint_type,owner from user_constraints;

CONSTRAINT_NAME C OWNER


FK_DEPTNO R SCOTT
SYS_C009046 C SCOTT
NN_T1_ID C SCOTT
PK_DEPT P SCOTT
PK_EMP P SCOTT
SYS_C009047 V SCOTT
2 unique(惟一)
建立
SQL> drop table t1 purge;

Table dropped.

SQL> create table t1(id number,qq number,constraint un_t1_qq unique(qq));

Table created.
修改
SQL> drop table t1 purge;

Table dropped.

SQL> create table t1(id number,qq number);

Table created.
SQL> alter table t1 add constraint un_t1_qq unique(qq);

Table altered.
3 primary key(主键)
建立
SQL> drop table t1 purge;

Table dropped.

SQL> create table t1(id number,qq number,constraint pk_t1_id primary key(id));

Table created.
修改
SQL> drop table t1 purge;

Table dropped.
SQL> create table t1(id number,qq number);

Table created.

SQL> alter table t1 add constraint pk_t1_id primary key(id);

Table altered.
4 foreign key(外键)
建立
SQL> create table t2(id number,cc number,constraint fk_t2_id foreign key(id) references t1(id));

Table created.
修改
SQL> drop table t2 purge
2 ;

Table dropped.

SQL> create table t2(id number,cc number);

Table created.

SQL> alter table t2 add constraint pk_t2_id foreign key(id) references t1(id);

Table altered.
当定义了外部键约束以后,要求外部键列的数据必须在主表的主键列(或唯一列)中存在,或者为NULL,FOREING KEY约束既能够在列级定义,也能够在表级定义。

关键字说明:
(1) FOREING KEY:该选项用于指定在表级定义外部键约束。当在表级定义外部键约束时必须指定该选项,在列级定义外部键约束不须要指定该选项
(2) REFERENCES:该选项用于指定主表名及其主键列。当定义外部键约束时,该选项必须指定.。
(3) ON DELETE CASCAED:该选项用于指定级联删除选项。若是在定义外部键约束时指定了该选项,那么当删除主表数据时会级联删除从表的相关数据。
(4) ON DELECT SET NULL:该选项用于指定转换相关的外部键值为NULL,若是在定义外部键约束时指定了该选项,那么当删除主表数据时会将从表外部键列的数据设置为NULL。
5 check(检查性约束)
建立
SQL> create table t3(id number,sal number,constraint ck_t3_sal check(sal between 5000 and 50000));

Table created.
修改
SQL> drop table t3 purge;

Table dropped.

SQL> create table t3(id number,sal number);
六 维护约束

1 增长约束
(1) 若是增长UNIQUE、PRIMARY KEY、FOREIGN 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;

2 修改约束名
在同一个方案中,约束名必须唯一,而且约束名也不能与其余对象同名。当用IMPDP工具或者IMP工具导入其余对象时,如发现有同名的对象,将会出错
语法:
ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name
TO new_constraint_name;
SQL> ALTER TABLE T1 rename constraint pk_t1_id to pk_t1_idnew
2 ;

Table altered.

3 禁止约束

禁止约束指使约束临时失效。当禁止了约束以后,约束规则将再也不生效。在使用SQL*LOADER或INSERT装载数据以前,为了加快数据装载速度,应该首先禁止约束,而后装载数据。
语法:
ALTER TABLE table_name
DISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用于指定级联禁止从表的外部键
SQL> ALTER TABLE T2 DISABLE constraint pk_t2_id;

Table altered.
4 激活约束

语法:
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
SQL> ALTER TABLE T2 enABLE constraint pk_t2_id;

Table altered.
5 删除约束

当删除特定表的主键约束时,若是该表具备相关的从表,那么在删除主键约束时必须带有CASCAED选项
语法:
ALTER TABLE table_name DROP
CONSTRAINT constraint_name |PRIMARY KEY
SQL> ALTER TABLE T3 drop constraint ck_t3_sal;

Table altered.
6 显示信息

1.USER_CONSTRAINTS
2.USER_CONS_COLUMNS
3.SQL> set line 100
SQL> col CONSTRAINT_NAME format A20
SQL> col table_NAME format A20
SQL> col column_NAME format A20
SQL> select constraint_name,table_name,column_name from user_cons_columns where table_name='T1';

CONSTRAINT_NAME TABLE_NAME COLUMN_NAME


PK_T1_ID T1 ID

Table created.

SQL> alter table t3 add constraint ck_t3_sal check(sal>5000);

Table altered.

相关文章
相关标签/搜索