数据库完整性约束

一、五种完整性约束

1.NOT NULL(非空):默认情况下,表中的所有列均允许空值。Null 指没有值。NOT NULL 约束条件要求表列必须包含非空值.

2.UNIQUE Key(唯一键):UNIQUE 键完整性约束条件要求一列或一组列(键)中的每个值必须唯一,即在指定的列或一组列中,表任意两行的值均不重复。ORACLE允许该列有多个NULL,而SQLSERVER只允许有一个NULL。PRIMARY KEY一个表只允许加在一个属性上,而UNIQUE允许加在多个属性上。

3.PRIMARY KEY(主键):数据库中的每个表最多可包含一个PRIMARY KEY 约束条件。在这个约束条件的限制下,单个列或一组列中的值就构成了行的唯一标识符。
事实上,每行的名称均由其主键值确定。

4.FOREIGN KEY(外键,引用完整性约束条件)关系数据库中的各个表通过公用列相互关联,因此必须维护用于管理列关系的规则。引用完整性规则可确保这些关系能够持续下去。对于每个表行,引用完整性约束条件要求外键中的值必须与父键中的值匹配。

5.CHECK(检查约束条件)单个列或一组列的CHECK 完整性约束条件要求为每个表行指定的条件必须为真或未知。如果数据操纵语言(DML) 语句对CHECK 约束条件的求值为假,则会回退语句。

EXAMPLE1:

create table t1 (c1 number constraint t1_c1_pk primary key,
c2 number constraint t1_c2_c check(c2>0),
c3 number constraint t1_c3_n not null)

EXAMPLE2:

create table t2(cc1 number,cc2 number,constraint t2_cc1_u unique(cc1),constraint t2_cc2_fk foreign key(cc2) references t1(c1) on delete cascade| on delete set null )

总的来讲on delete cascade和on delete set null的作用是用来处理级联删除问题的,如果你需要删除的数据被其他数据所参照,那么你应该决定到底希望oracle怎么处理那些参照这些即将要删除数据的数据的,你可以有三种方式:
  1、将那些参照本值的数据的对应列赋空,这个需要使用on delete set null关键字
  2、将那些参照本值的数据一并删除,这个需要使用on delete cascade关键字
  3、禁止删除。这也是oracle默认的
  使用on delete set null有一点需要注意的是,被参参照其他表的那一列必须能够被赋空,不能有not null约束

数据字典user_constrants可以查看自己创建的约束名称。

数据字典user_cons_columns可以查看约束相对应的列名。

二、关于enable disable 与validate novalidate

enable novalidate-启用约束,但不检查原始数据,只检查新插入数据

enable validate-启用约束,并检查原始数据

disable novalidate-禁用约束,不检查原始数据。

DISABLE VALIDATE:如果约束条件处于此状态,则不允许对受约束的列进行任何修改,因为在验证现有数据后又允许将未经检查的数据输入表中,会出现不一致的情况。在必须验证现有数据,但不希望修改数据,而且考虑到性能又不需要另外创建索引时,通常会使用此状态。

EXAMPLE:

 create table t3 (c1 number constraint t3_c1_pk primary key,c2 number);

insert into t3 values(1,2);

insert into t3 values(1,2);//不允许

alter table t3 disable novalidate constraint t3_c1_pk;

insert into t3 values(1,2);//允许

alter table t3 enable novalidate constraint t3_c1_pk;//对于unique和primary keyl会出现错误,原因如下:

注意:唯一性约束disable之后,会将原来建立的唯一性索引删除,enable后会重新建立唯一性索引,如果表中有违法约束的数据后,那么重新建唯一性索引时会出现错误,此时即使使用novalidate也不会起作用。此时,如果自己创建一个非唯一性索引create index。。。,然后再enable就可成功。

三、延时性约束与立即型约束

延时性约束只有在commit时生效,而立即型会立即生效。默认情况是立即型。延迟型可以转换为立即型,但立即型不能转换为延迟型。

EXAMPLE:

alter table t3 add constraint t3_c2_u unique(c1) initially deferred;

alter table t3 add constraint t3_c2_u unique(c1) initially immediate;

四、对于违反约束条件的数据的查找。

当使用enable volatile时,会对表中的原有数据进行约束检查,如果原表中有违反约束的数据会出现错误,这时需要查看找到违反约束的数据。

1.查看表中有哪些约束。数据字典user_constrants可以查看创建的约束名称,以及约束的条件(search_condition)。

2.创建exceptions表。到C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN找到名为utlexcpt.sql的文件,执行里面的语句来创建exceptions表。

3.alter table t3 enable constraint t3_c1_u EXCEPTIONS INTO exceptions;使约束生效,并将违反约束的记录的信息放到exceptions表中。

4.select*from exceptions;找到rowid.

5.select rowid,c1,c2 from t3 where rowid in(select row_id from exceptions);找到违反约束的数据。

6.update ....修改数据。

7..enable.

 

 

 

 

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值