Oracle约束的关键字Enable/Disable/Validate/Novalidate
分类: [oracle]--[PL/SQL]
小结:
enable/disable对未来的数据有约束/无约束。
validate/novalidate对已有的数据有约束/无约束。
约束有如下四种状态
(1)ENABLEVALIDATE:约束在创建时,默认就是此状态。此状态会“检查表中原有行和新插入的行”。
(2)ENABLENOVALIDATE:不能输入违反约束的新数据。但是,在创建约束时,并不检查表中原有行。
(3)DISABLEVALIDATE:检查表中原有行是否违反约束,表中可以插入违反约束的行。
(4)DISABLENOVALIDATE:约束处于禁用状态,且此状态检查表中原有数据是否违反约束.
参考博客:
http://blog.csdn.net/guoyjoe/article/details/8640270
注释:
1、
表中,未来的数据和已有的数据:
已有的数据,表示执行alter table test validate(或是Novalidate) constraint ck_id前已经在表test中存在的数据,或是执行alter table test validate(或是Novalidate) constraint ck_id后每当执行了一次DML操作引起了存放于表中的数据的变化时都会进行一次约束条件检查,而进行该约束条件检查时存在于表中的数据也被称作已有的数据。
未来的数据,表示执行alter table test Enable/Disable constraint ck_id后每当执行了一次DML操作时在修改后的数据存入表中来替代修改前值之前会进行一次约束条件检查。
2、
Enable/Disable和Validate/Novalidate这两组关键字修饰的都是同一个对象,即constraint这种类型的对象。
在修饰同一个对象时,两组关键字间是并列关系,即Enable/Disable这组关键字作用在未来的数据(即表上插入/更新/删除的数据)上,而Validate/Novalidate这组关键字作用在表上已有的数据上。
上图中,?表示不受约束条件限制,√表示受约束条件限制。
这里要说说×表示什么意思?
disable和validate组合在一起时,由于disable是表示对未来的数据不受约束条件限制,即对DML操作修改过的数据都不进行约束条件检查。现在假设一条不符合约束条件的数据插入了表中,而Validate/Novalidate这组关键字是每次表中的数据有变化时进行一次约束条件检查,故而当Validate在该条不符合约束条件的数据插入了表后进行了一次约束条件检查,发现该数据不符合约束条件,就会报错。由此看出disable和validate组合在一起时,DML操作修改的数据存放在表中有可能会不符合约束条件,所以oracle设计人员就规定disable和validate组合在一起时不允许进行DML操作对该表。所以,X表示不允许执行DML操作的意思。所以,如果你不想某个表被DML操作修改,则可以采用disable和validate组合在一起的方法。
===============================================================================================
1组合特性说明
Enable/Disable和Validate/Novalidate这两组关键字修饰的都是同一个对象,即constraint这种类型的对象。
Validate的作用: 确保已有数据符合约束;
Novalidate的作用:不必考虑已有数据是否符合约束。
由此可以看出,
Validate和Novalidate的不同点在于表中已有数据的作用上:
Validate验证已有数据是否符合约束;Novalidate不必考虑已有数据是否符合约束。
Validate和Novalidate的相同点在于表上插入/更新/删除的数据的作用上:
对于表上插入/更新/删除的数据,两者都会确保这些数据符合约束。
在修饰同一个对象时,两组关键字间不是并列关系,而是上下从属关系,即Enable/Disable这组关键字从属于Validate/Novalidate这组关键字。而且,在Validate/Novalidate这组关键字所作用的两个范围:表中已有数据和表上插入/更新/删除的数据中,Enable/Disable这组关键字只能影响一个范围,即表上插入/更新/删除的数据。
Validate
Novalidate
已有记录
新增/删除记录
已有记录
新增/删除记录
Enable
Yes(表示需要受到约束条件限制)
Yes
No
Yes
Disable
Yes
No
No
No
从上表可以看出,
对于带有Validate的约束(constraint,名词),无论Enable还是Disable该约束,该约束对表中已有记录都是会验证这些表中已有记录是否符合约束条件的,而对于带有noValidate的约束(constraint,名词),无论Enable还是Disable该约束,该约束对表中已有记录都是不会验证这些表中已有记录是否符合约束条件的。
对于表上插入/更新/删除的数据,enable带有Validate的约束或是带有noValidate的约束,则都会验证这些表上插入/更新/删除的数据是否符合约束条件的;反之,Disable带有Validate的约束或是带有noValidate的约束,则都不会验证这些表上插入/更新/删除的数据是否符合约束条件的。
例如,alter table test disable validate constraint ck_id,表示禁用(Disable)带有验证(Validate)属性的约束ck_id,其中
Disable作为支配约束这个对象的动词来翻译,而Validate作为修饰约束这个对象的形容词来翻译。
注释:
Validate确保已有数据符合约束;
Novalidate不必考虑已有数据是否符合约束。
除非Novalidate被指定,Enable默认Validate;
除非Validate被指定,Disable默认Novalidate。
Enable Validate与Enable相同,表示检查已有记录和新增记录(即表上插入/更新/删除的数据),确保都符合约束;
Enable Novalidate,表示允许已有记录不必满足约束条件,但新增/修改的记录(即表上插入/更新/删除的数据)必须满足;
Disable Validate,表示禁用(带有Validate的)约束,删除约束上的索引(??),不允许修改任何被约束的记录(即表上插入/更新/删除的数据??);
Disable Novalidate与Disable相同,表示禁用(带有noValidate的)禁用约束,删除约束上的索引(??),且允许修改被约束的记录(即表上插入/更新/删除的数据??)。
2建表
SQL> create table test(id int, name varchar2(10));
Table created
SQL> alter table test add constraint ck_id check(id > 10);
Table altered
3测试1: Enable Validate
SQL> alter table test Enable validate constraint ck_id;
Table altered
SQL> insert into test values(5, 'Oracle');
insert into test values(5, 'Oracle')
ORA-02290:违反检查约束条件 (MYHR.CK_ID)
SQL> insert into test values(17,'ERP');
1 row inserted
SQL> commit;
Commit complete
4测试2: Enable Novalidate
SQL> alter table test disable constraint ck_id;
Table altered
SQL> insert into test values(5, 'Oracle');
1 row inserted
SQL> commit;
Commit complete
SQL> select * from test;
ID NAME
----------- ----------
17 ERP
5 Oracle
SQL> alter table test enable novalidate constraint ck_id;
Table altered
SQL> insert into test values(32, 'SAP');
1 row inserted
SQL> insert into test values(3, 'Linux');
insert into test values(3, 'Linux')
ORA-02290:违反检查约束条件 (MYHR.CK_ID)
SQL> commit;
Commit complete
5测试3: Disable Validate
SQL> delete from test where id < 10;
1 row deleted
SQL> commit;
Commit complete
SQL> alter table test disable validate constraint ck_id;
Table altered
SQL> select * from test;
ID NAME
------------- ----------
17 ERP
32 SAP
SQL> update test set name = 'Change' where id = 17;
update test set name = 'Change' where id = 17
ORA-25128:不能对带有禁用和验证约束条件 (MYHR.CK_ID)的表进行插入/更新/删除
ORA-25128:no insert/update/delete on table with constraint disabled and validated
6测试4: Disable Novalidate
SQL> alter table test disable novalidate constraint ck_id;
Table altered
SQL> insert into test values(2, 'Linux');
1 row inserted
SQL> insert into test values(13, 'Windows');
1 row inserted
SQL> update test set name = 'Change' where id = 17;
1 row updated
SQL> commit;
Commit complete
SQL> select * from test;
ID NAME
---------- ----------
17 Change
13 Windows
32 SAP
2 Linux
————————————————
版权声明:本文为CSDN博主「haiross」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/haiross/article/details/41977717