约束constraint的 enable/disable novalidate总结
来源:互联网 发布:火炬之光2优化补丁 编辑:程序博客网 时间:2024/05/15 22:46
转自:http://blog.chinaunix.net/uid-20274021-id-1969663.html
我们知道对constraint的开启和关闭共有四种:enable validate;enable novalidate;disable validate;disable novalidate。
enable validate/disable validate 这两种没什么说的。
enable novalidate/disable novalidate 分别表示开启时不检查已存在数据/不检查今后的数据。
enable novalidate/disable novalidate 分别表示开启时不检查已存在数据/不检查今后的数据。
今天主要对enable novalidate/disable novalidate 做个简单测试。
SQL> create table pk1(id number(2),name varchar2(8));
表已创建。
SQL> insert into pk1 values(1,'abc');
已创建 1 行。
SQL> alter table pk1 add constraint pk_pk1 primary key(id); --设置主键约束。
表已更改。
SQL> create table fr1(id number(2),name varchar2(8));
表已创建。
SQL> insert into fr1 values(1,'abc');
已创建 1 行。
SQL> alter table fr1 add constraint fk_fr1 foreign key(id) references pk1(id);
表已更改。
--设置外键。
测试外键下使用enable novalidate/disable novalidate的情况
SQL> insert into fr1 values(2,'aaa');
insert into fr1 values(2,'aaa')
*
第 1 行出现错误:
ORA-02291: 违反完整约束条件 (SYS.FK_FR1) - 未找到父项关键字
insert into fr1 values(2,'aaa')
*
第 1 行出现错误:
ORA-02291: 违反完整约束条件 (SYS.FK_FR1) - 未找到父项关键字
SQL> alter table fr1 disable novalidate constraint fk_fr1;
表已更改。
SQL> insert into fr1 values(2,'aaa');
已创建 1 行。
SQL> select * from fr1;
ID NAME
---------- --------
1 abc
2 aaa
---------- --------
1 abc
2 aaa
SQL> alter table fr1 enable validate constraint fk_fr1;
alter table fr1 enable validate constraint fk_fr1
*
第 1 行出现错误:
ORA-02298: 无法验证 (SYS.FK_FR1) - 未找到父项关键字
alter table fr1 enable validate constraint fk_fr1
*
第 1 行出现错误:
ORA-02298: 无法验证 (SYS.FK_FR1) - 未找到父项关键字
SQL> alter table fr1 enable novalidate constraint fk_fr1;
表已更改。
--从上面测试结果可见enable novalidate和disable novalidate在外键约束下使用是好用的。
测试主键下使用enable novalidate/disable novalidate的情况
SQL> select * from pk1;
ID NAME
---------- --------
1 abc
---------- --------
1 abc
SQL> alter table pk1 disable novalidate primary key;
alter table pk1 disable novalidate primary key
*
第 1 行出现错误:
ORA-02297: 无法禁用约束条件 (SYS.PK_PK1) - 存在相关性
alter table pk1 disable novalidate primary key
*
第 1 行出现错误:
ORA-02297: 无法禁用约束条件 (SYS.PK_PK1) - 存在相关性
SQL> alter table fr1 disable validate constraint fk_fr1;
表已更改。
SQL> alter table pk1 disable novalidate primary key;
表已更改。
SQL> insert into pk1 values(1,'ccc');
已创建 1 行。
SQL> select * from pk1;
ID NAME
---------- --------
1 abc
1 ccc
---------- --------
1 abc
1 ccc
SQL> alter table pk1 enable novalidate primary key;
alter table pk1 enable novalidate primary key
*
第 1 行出现错误:
ORA-02437: 无法验证 (SYS.PK_PK1) - 违反主键
alter table pk1 enable novalidate primary key
*
第 1 行出现错误:
ORA-02437: 无法验证 (SYS.PK_PK1) - 违反主键
SQL> select INDEX_NAME,TABLE_NAME,TABLE_OWNER from user_indexes where index_name
='PK_PK1';
='PK_PK1';
未选定行
--主键对应的索引PK_PK1已经不在了。
SQL> create index cc on pk1(id);
索引已创建。
SQL> alter table pk1 enable novalidate primary key;
表已更改。
--OK了。
--从上面的测试结果看出:novalidate在非主键,唯一键时可以正常工作。在对主键,唯一键使用时需要先创建相关索引,再使用novalidate。Primary and unique keys must use nonunique indexes。
举一个使用novalidate的案例:
给一个有数据的表增加一个非空的列。要求:需要在该表上增加一个字段status,但该字段不能为空,历史数据可以为空。最后将历史数据的该新加字段统一置为1
SQL> desc pk1;
名称 是否为空? 类型
----------------------------------------- -------- -------------
名称 是否为空? 类型
----------------------------------------- -------- -------------
ID NOT NULL NUMBER(2)
NAME VARCHAR2(8)
NAME VARCHAR2(8)
SQL> select * from pk1;
ID NAME
---------- --------
1 abc
2 cba
---------- --------
1 abc
2 cba
SQL> alter table pk1 add status number(1);
表已更改。
SQL> alter table pk1 modify status not null enable novalidate;
表已更改。
SQL> select * from pk1;
ID NAME STATUS
---------- -------- ----------
1 abc
2 cba
---------- -------- ----------
1 abc
2 cba
SQL> update pk1 set status=1;
已更新2行。
SQL> commit;
提交完成。
SQL> select * from pk1;
ID NAME STATUS
---------- -------- ----------
1 abc 1
2 cba 1
---------- -------- ----------
1 abc 1
2 cba 1
SQL> insert into pk1 values(3,'bca',null);
insert into pk1 values(3,'bca',null)
*
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SYS"."PK1"."STATUS")
0 0
- 约束constraint的 enable/disable novalidate总结
- 约束disable/enable validate/novalidate 的区别
- Oracle 约束enable/disable novalidate
- Oracle约束的关键字Enable/Disable/Validate/Novalidate
- Oracle约束的关键字Enable/Disable/Validate/Novalidate
- Oracle约束的关键字Enable/Disable/Validate/Novalidate
- Oracle约束的关键字Enable/Disable/Validate/Novalidate
- disable/enable validate/novalidate的区别
- disable/enable validate/novalidate 的区别
- disable/enable validate/novalidate 的区别 (ORACLE)
- disable/enable validate/novalidate 的区别
- disable/enable validate/novalidate 的区别
- Enable/Disable/Validate/Novalidate
- Oracle之表示约束状态的关键字Enable/Disable/Validate/Novalidate
- enable validate/novalidate 以及 disable validate/novalidate
- oracle 9i 把表read only?oracle中的 CONSTRAINT 属性ENABLE DISABLE VALIDATE NOVALIDATE
- Oracle约束的关键字Enable/Disable…
- Oracle PL/SQL之ENABLE NOVALIDATE约束
- 第一次
- Android控件_ListView优化[分批加载]
- Qt 正则表达式
- hibernate:一对多关系中的inverse 和cascade
- linux 下GDB调试
- 约束constraint的 enable/disable novalidate总结
- poj_3295 枚举
- “情妇文化”入港,“幼儿便溺”算啥
- 文件与内存的桥梁:Page Cache
- XCode的一些调试技巧
- 个人服务器
- java设计模式(1):简单工厂模式(Simple Factory)
- linux如何根据进程ID查找启动程序的路径
- Worysan