Constraint State(disable/enable validate/noalidate)

lixianlinde發表於2013-01-07
At any time, every constraint is either enabled or disabled, and validated or not 
validated. Any combination of these is syntactically possible:
 ENABLE VALIDATE   It is not possible to enter rows that would violate the 
constraint, and all rows in the table conform. to the constraint.
 DISABLE NOVALIDATE  Any data (conforming or not) can be entered, and 
there may already be nonconforming data in the table.
 ENABLE NOVALIDATE  There may already be nonconforming data in the 
table, but all data entered now must conform.
 DISABLE VALIDATE   An impossible situation: all data in the table conforms 
to the constraint, but new rows need not. The end result is that the table is 
locked against DML commands.



http://blog.csdn.net/priestmoon/article/details/6197379
enable/disable validate/novalidate
以上兩項都是對約束的設定選項

enable/disable   
針對新插入/更新的資料進行/不進行約束驗證,預設enable。
enable時,如果是主鍵或唯一鍵,首先檢視列上是否有索引,如果有就用。沒有就新建。
disable時,如果是主鍵或唯一鍵,會刪除enable時新建的索引,但自定義索引不受影響。

validate/novalidate 
針對已有資料進行/不進行約束驗證,預設validate

①enable validate
對新資料做驗證,同時保證舊資料驗證通過。如果舊資料違反約束,則必須修改或刪除這部分資料,否則不能建立約束。

②enable novalidate
對新資料做驗證,同時忽略舊資料的約束合法性。如果舊資料違反主鍵/唯一鍵約束,並且事先沒有定義該列的非唯一索引(nonunique index),則本設定不能通過。因為在enable時,系統會新建一個unique index,而舊資料顯然不能支援這一操作。所以要使本設定生效,必須對違反主鍵/唯一鍵約束的列上新增nonunique index。方法是create index on ()。

③disable validate
保證已有資料的約束合法性,同時禁止表的insert/update/delete操作。

④disable novalidate
忽略約束合法性

ORACLE中,約束分deferred 跟 immediate 2種:
  deferred:如果 Oracle 在事務提交(commit)時才對約束執行檢查,則稱此約束是延遲的(deferred)。如果資料違反了延遲約束,提交操作將導致事務被回滾(undo)。 
  immediate:如果約束是即時的(immediate)(非延遲的),則此約束將在語句執行結束後進行檢查。如果資料違反了延遲約束,語句將被立即回滾。

一般情況下,我們用的約束初始都是immediate型的(預設),而且不好轉為deferred型。但是如果初始是deferrable(需要手動指定),那deferred跟immediate 2種狀態可以隨意轉換。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24570973/viewspace-752225/,如需轉載,請註明出處,否則將追究法律責任。

Constraint State(disable/enable validate/noalidate)
請登入後發表評論 登入
全部評論

相關文章