Oracle之表示約束狀態的關鍵字Enable/Disable/Validate/Novalidate


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM