?
? ????? PHP ??? ???? ??? ?? ??
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }
SET CONSTRAINTS設(shè)置當(dāng)前事務(wù)里的約束檢查的特性。 IMMEDIATE約束是在每條語句后面進(jìn)行檢查。 DEFERRED約束一直到事務(wù)提交時才檢查。 每個約束都有自己的IMMEDIATE或者DEFERRED模式。
從創(chuàng)建的時候開始,一個約束總是給定為 DEFERRABLE INITIALLY DEFERRED, DEFERRABLE INITIALLY IMMEDIATE或者 NOT DEFERRABLE三個特性之一。第三種總是IMMEDIATE, 并且不會受SET CONSTRAINTS影響。 頭兩種以指定的方式啟動每個事務(wù),但是他們的行為可以在事務(wù)里用SET CONSTRAINTS改變。
帶著一個約束名列表的SET CONSTRAINTS改變這些約束的模式(都必須是可推遲的)。 每個約束名稱可以有模式修飾。如果有多個約束匹配某個名字,那么所有都會被影響。 SET CONSTRAINTS ALL改變所有可推遲約束的模式。
當(dāng)SET CONSTRAINTS把一個約束從DEFERRED改成IMMEDIATE的時候, 新模式反作用式地起作用:任何將在事務(wù)結(jié)束準(zhǔn)備進(jìn)行的數(shù)據(jù)修改都將在SET CONSTRAINTS的時候執(zhí)行檢查。 如果違反了任何約束,SET CONSTRAINTS都會失敗(并且不會修改約束模式)。因此, SET CONSTRAINTS可以用于強(qiáng)制在事務(wù)中某一點進(jìn)行約束檢查。
目前,僅UNIQUE, PRIMARY KEY,REFERENCES (外鍵), 和EXCLUDE約束受該設(shè)置影響。NOT NULL和CHECK 約束總在一行被插入或者調(diào)整時被檢查(不在語句末)。未聲明 DEFERRABLE的唯一性和排斥性約束也立即檢查。
被聲明為"constraint triggers"的觸發(fā)器的觸發(fā)也是受該設(shè)置控制的— 他們在相關(guān)約束應(yīng)被檢查的相同時間觸發(fā)。
因為PostgreSQL不要求約束名稱在一個模式內(nèi)是獨(dú)一無二的 (但僅是每個表的),多于一個約束名匹配一個特定約束名是可能的。在這種情況下, SET CONSTRAINTS將作用于所有的匹配。對于一個無模式修飾的名稱, 一旦一個或多個匹配在搜索路徑下的相同模式被找到,路徑中晚出現(xiàn)的模式不會被找到。
這個命令只在當(dāng)前事務(wù)里修改約束的行為。因此, 如果你在事務(wù)塊之外(BEGIN/COMMIT對)執(zhí)行這個命令, 它將沒有任何作用。
這條命令與SQL標(biāo)準(zhǔn)里定義的行為兼容,只不過,在PostgreSQL里, 它不適用于NOT NULL和CHECK約束。 同時,PostgreSQL直接檢查不可推延的唯一性約束, 不是像標(biāo)準(zhǔn)建議的那樣在語句末。