SET CONSTRAINTS — 設定當前事務的約束檢查時機
SET CONSTRAINTS { ALL | name
[, ...] } { DEFERRED | IMMEDIATE }
SET CONSTRAINTS
設定當前事務中約束檢查的行為。IMMEDIATE
約束在每個語句結束時檢查。DEFERRED
約束直到事務提交時才檢查。每個約束都有自己的 IMMEDIATE
或 DEFERRED
模式。
建立時,約束會被賦予以下三種特性之一:DEFERRABLE INITIALLY DEFERRED
(可推遲,初始時推遲)、DEFERRABLE INITIALLY IMMEDIATE
(可推遲,初始時立即)或 NOT DEFERRABLE
(不可推遲)。第三種特性總是 IMMEDIATE
並且不受 SET CONSTRAINTS
命令的影響。前兩種特性會在每個事務開始時處於指定的模式,但其行為可以在事務內部透過 SET CONSTRAINTS
改變。
SET CONSTRAINTS
後面跟著一個約束名稱列表,它只會改變這些約束的模式(這些約束必須都是可推遲的)。每個約束名稱都可以指定模式。如果未指定模式,則會根據當前模式搜尋路徑查詢第一個匹配的名稱。SET CONSTRAINTS ALL
會改變所有可推遲約束的模式。
當 SET CONSTRAINTS
將約束的模式從 DEFERRED
更改為 IMMEDIATE
時,新的模式會追溯生效:任何本應在事務結束時檢查的未完成資料修改將會在 SET CONSTRAINTS
命令執行期間進行檢查。如果任何此類約束被違反,SET CONSTRAINTS
將會失敗(並且不會改變約束模式)。因此,SET CONSTRAINTS
可用於強制在事務中的特定點進行約束檢查。
目前,只有 UNIQUE
、PRIMARY KEY
、REFERENCES
(外部索引鍵)和 EXCLUDE
約束會受到此設定的影響。NOT NULL
和 CHECK
約束總是在插入或修改行時立即檢查(不是在語句結束時)。未宣告為 DEFERRABLE
的唯一性和排除約束也會立即檢查。
宣告為“約束觸發器”的觸發器的觸發也受此設定控制——它們會在關聯約束應被檢查的同時觸發。
由於 PostgreSQL 不要求模式內的約束名稱唯一(只要求表內唯一),因此可能存在一個指定約束名稱的多個匹配項。在這種情況下,SET CONSTRAINTS
將會作用於所有匹配項。對於非模式限定的名稱,一旦在搜尋路徑中的某個模式中找到一個或多個匹配項,將不再搜尋路徑中靠後的模式。
此命令僅會改變當前事務中約束的行為。在事務塊外發出此命令會發出警告,但除此之外沒有其他影響。
此命令遵循 SQL 標準定義的行為,除了一個限制:在 PostgreSQL 中,它不適用於 NOT NULL
和 CHECK
約束。此外,PostgreSQL 會立即檢查不可推遲的唯一性約束,而不是在語句結束時檢查,這一點與標準建議不同。
如果您在文件中發現任何不正確、與您使用該特定功能時的經驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。