我们先回顾一下关于启用和禁用约束的4种组合:
启用约束:
enable( validate):启用约束,创建索引,对已有及新加入的数据执行约束。
enable novalidate : 启用约束,创建索引,仅对新加入的数据强制执行约束,而不管表中的现有数据。
禁用约束:
disable( novalidate):关闭约束,删除索引,可以对约束列的数据进行修改等操作。
disable validate :关闭约束,删除索引,不能对表进行 插入/更新/删除等操作。
我们针对主键约束的enable novalidate做如下测试。
1.创建测试表
点击( 此处 )折叠或打开- SQL> select * from v$version;
-
- BANNER
- ----------------------------------------------------------------
- Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
- PL/SQL Release 10.2.0.4.0 - Production
- CORE 10.2.0.4.0 Production
-
- TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
- NLSRTL Version 10.2.0.4.0 - Production
-
- SQL> create table hoegh(x number,y number,z number,
- 2 constraint pk_hoegh primary key(x,y));
-
- Table created
-
- SQL>
- SQL> insert into hoegh values(1,1,1);
-
- 1 row inserted
-
- SQL> insert into hoegh values(1,2,1);
-
- 1 row inserted
-
- SQL> commit;
-
- Commit complete
-
- SQL> select * from hoegh;
-
- X Y Z
- ---------- ---------- ----------
- 1 1 1
- 1 2 1
-
- SQL>
2.删除原有主键
点击( 此处 )折叠或打开- SQL> alter table hoegh drop constraint PK_HOEGH cascade drop index;
-
- Table altered
3.添加新主键并设置Enable Novalidate,报错
点击(
此处
)折叠或打开
- SQL> alter table hoegh add constraint PK_HOEGH primary key(x,z) enable novalidate;
-
- alter table hoegh add constraint PK_HOEGH primary key(x,z) enable novalidate
-
- ORA-02437: 无法验证 (HOEGH.PK_HOEGH) - 违反主键
-
- SQL>
我们知道主键约束=唯一约束+非空约束,那么这个是不是和唯一约束有关系呢?接下来,我们尝试添加一个唯一约束,同时设置Enable Novalidate。
点击(此处)折叠或打开
- SQL> alter table hoegh add constraint unq_xz unique(x,z) enable novalidate;
-
- alter table hoegh add constraint unq_xz unique(x,z) enable novalidate
-
- ORA-02299: 无法验证 (HOEGH.UNQ_XZ) - 找到重复关键字
-
- SQL>
那么如何解决这个问题呢?
4.创建普通索引,然后添加主键约束并设置Enable Novalidate,成功
我们可以在创建主键前先给该字段建个普通非唯一索引,这样建主键时系统就会自动利用这个普通索引了。点击( 此处 )折叠或打开
- SQL>
- SQL> create index idx_xz on hoegh(x,z);
-
- Index created
-
- SQL> alter table hoegh add constraint PK_HOEGH primary key(x,z) enable novalidate;
-
- Table altered
-
- SQL> insert into hoegh values(1,3,1);
-
- insert into hoegh values(1,3,1)
-
- ORA-00001: 违反唯一约束条件 (HOEGH.PK_HOEGH)
-
- SQL> select * from hoegh;
-
- X Y Z
- ---------- ---------- ----------
- 1 1 1
- 1 2 1
-
- SQL>
- SQL> insert into hoegh values(1,3,2);
-
- 1 row inserted
-
- SQL> commit;
-
- Commit complete
-
- SQL>
- SQL> select * from hoegh;
-
- X Y Z
- ---------- ---------- ----------
- 1 1 1
- 1 2 1
- 1 3 2
-
- SQL>
5.结论
从上面的测试结果看出,enable novalidate在针对主键约束或者唯一约束使用时需要先创建相关索引,再使用 enable novalidate。 ~~~~~~~ the end~~~~~~~~~
hoegh
2016.06.19
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30162081/viewspace-2120425/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30162081/viewspace-2120425/