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
