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
僅變更這些約束條件的模式(這些約束條件必須都是可延遲的)。每個約束條件名稱都可以使用 schema 限定。如果沒有指定 schema 名稱,則使用目前的 schema 搜尋路徑來尋找第一個相符的名稱。SET CONSTRAINTS ALL
變更所有可延遲約束條件的模式。
當 SET CONSTRAINTS
將約束條件的模式從 DEFERRED
變更為 IMMEDIATE
時,新模式會追溯生效:任何未完成的資料修改,本應在交易結束時檢查,都改為在執行 SET CONSTRAINTS
指令期間檢查。如果違反任何此類約束條件,SET CONSTRAINTS
將會失敗(且不會變更約束條件模式)。因此,SET CONSTRAINTS
可用於強制在交易中的特定時間點發生約束條件檢查。
目前,只有 UNIQUE
、PRIMARY KEY
、REFERENCES
(foreign key) 和 EXCLUDE
約束條件會受到此設定的影響。NOT NULL
和 CHECK
約束條件總是在插入或修改列時立即檢查(不是 在陳述式結束時)。尚未宣告為 DEFERRABLE
的唯一性和排除約束條件也會立即檢查。
宣告為「約束條件觸發程序」的觸發程序的觸發也由此設定控制 — 它們會在應該檢查相關約束條件的同一時間觸發。
由於 PostgreSQL 不要求約束條件名稱在 schema 內必須唯一(但每個資料表必須唯一),因此指定的約束條件名稱可能有多個相符項目。在這種情況下,SET CONSTRAINTS
將對所有相符項目執行操作。對於非 schema 限定的名稱,一旦在搜尋路徑中的某些 schema 中找到一個或多個相符項目,就不會搜尋路徑中稍後出現的 schema。
此指令只會變更目前交易中約束條件的行為。在交易區塊之外發出此指令會發出警告,否則沒有任何作用。
此指令符合 SQL 標準中定義的行為,但有限制,即在 PostgreSQL 中,它不適用於 NOT NULL
和 CHECK
約束條件。此外,PostgreSQL 會立即檢查不可延遲的唯一性約束條件,而不是像標準建議的那樣在陳述式結束時檢查。
如果您在文件中發現任何不正確、與特定功能的使用經驗不符或需要進一步說明的內容,請使用此表單回報文件問題。