SQL之延遲約束

RAYSUNNNY發表於2013-12-24
在建立約束的時候,有2種選項  deffered(延遲約束),not deffered(不延遲約束,立即檢驗,這是預設的選項)
例如:
create table A(a int constraint check_a check(a>0),b int check check_b(b>0));
create table A(a int constraint check_a check(a>0) not deferrable,b int constraint check_b check(b>0) not deferrable);
--以上2種定義出來的表都是沒有延遲約束的,也就是說,這是我們平時經常建立的表
--我們往A表插入資料
正常插入

不正常插入會立即報錯


drop table A;
create table A(a int constraint check_a check(a>0) deferrable initially immediate,b int constraint check_b check(b>0) deferrable initially deferred);


對於有延遲約束的表,插入更新資料時,帶有deferrable initially immediate的選項時會立即檢查約束,
帶有deferrable initially deferred的選項時不會立即檢查約束。

當使用commit提交事務時,這是會檢查延遲約束,如果有違反約束的記錄存在,則自動回滾事務
當使用 set contraint check_b immediate,也會檢查延遲約束,但是不會自動回滾事務


延遲約束有什麼用???
1.用於物化檢視
用於每插入一條,或修改資料時並不立即檢查約束,到提交事務時才檢查約束。。。
2.用於更新級聯
對於2個有主外來鍵關係的表,更新時就有個麻煩
比如我有2張表,q1(教師id,姓名name)  q2(學生id,姓名,教師id) 其中q2的教師id是一個外來鍵

往q1,q2裡插入一條資料

現在我想更改q1表中老師1的t_id號,但由於外來鍵原因,由於在q2表中已經有了對該id的引用,所以是改不了的

如果老師的id號確實寫錯了,但這2張表用了一段時間了,裡面的資料比較多,該怎麼辦呢?
那麼我們刪除那個外來鍵,重新建立一個延長約束外來鍵


這樣,我們先改q1表的教師id,然後再將q2表中對應的t_id 也改成一樣,最後再提交時就不會違反外來鍵的約束條件


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

相關文章