美图欣赏 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 数据库 > oracel >

Oracle约束的状态及验证机制

2017-08-14 16:45|来源:未知 |作者:dnzg |点击:

一、Oracle约束的状态

Oracle完整性约束的状态有4种,分别是ENABLE、DISABLE、VALIDATE、NOVALIDATE。

  • ENABLE          表示Oracle将检查要插入或更新的数据库中的数据是否符合约束;

  • DISABLE         表示表中可以存放违反约束的行;

  • VALIDATE       表示数据库验证表中的已存在数据是否符合约束;

  • NOVALIDATE  表示数据库不验证表中已存在数据是否符合约束。

Oracle默认约束状态为ENABLE、VALIDATE。

下面看Oracle官方给出的汇总:

Modified Data Existing Data Summary

ENABLE

VALIDATE

Existing and future data must obey the constraint. An attempt to apply a new constraint to a populated table results in an error if existing rows violate the constraint.

ENABLE

NOVALIDATE

The database checks the constraint, but it need not be true for all rows. Thus, existing rows can violate the constraint, but new or modified rows must conform to the rules.

DISABLE

VALIDATE

The database disables the constraint, drops its index, and prevents modification of the constrained columns.

DISABLE

NOVALIDATE

The constraint is not checked and is not necessarily true.

下面使用实例测试各状态:

创建测试表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
zx@ORA11G>create table t1 (id number,name varchar2(10),address varchar2(10));
 
Table created.
 
zx@ORA11G>insert into t1 values(1,'zx','hb');
 
1 row created.
 
zx@ORA11G>insert into t1 values(1,'zq','jx');
 
1 row created.
 
zx@ORA11G>insert into t1 values(2,'wl','sd');
 
1 row created.
 
zx@ORA11G>commit;
 
Commit complete.

1、测试ENABLE、VALIDATE状态

1
2
3
4
5
zx@ORA11G>alter table t1 add constraint t1_uk unique(id);
alter table t1 add constraint t1_uk unique(id)
                              *
ERROR at line 1:
ORA-02299: cannot validate (ZX.T1_UK) - duplicate keys found

因为id列中有重复值,此时创建约束t1_uk的状态为ENABLE、VALIDATE会验证表中已存在的数据,所以创建约束不成功。删除表中的重复数据再次创建约束即可成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
zx@ORA11G>delete from t1 where id=1 and name='zq';
 
1 row deleted.
 
zx@ORA11G>commit;
 
Commit complete.
 
zx@ORA11G>alter table t1 add constraint t1_uk unique(id);
 
Table altered.
 
zx@ORA11G>select table_name,constraint_name,constraint_type,deferrable,status,validated from user_constraints where table_name='T1';
 
TABLE_NAME             CONSTRAINT_NAME             C DEFERRABLE     STATUS   VALIDATED
------------------------------ ------------------------------ - -------------- -------- -------------
T1                 T1_UK               U NOT DEFERRABLE ENABLED VALIDATED
(责任编辑:dnzg)