支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

SET CONSTRAINTS

SET CONSTRAINTS — 設定目前交易的約束條件檢查時機

概要

SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }

說明

SET CONSTRAINTS 設定目前交易中約束條件檢查的行為。IMMEDIATE 約束條件在每個陳述式結束時檢查。DEFERRED 約束條件直到交易提交時才檢查。每個約束條件都有自己的 IMMEDIATEDEFERRED 模式。

在建立時,會給予約束條件三種特性之一:DEFERRABLE INITIALLY DEFERREDDEFERRABLE INITIALLY IMMEDIATENOT DEFERRABLE。第三種類別永遠是 IMMEDIATE,且不受 SET CONSTRAINTS 指令的影響。前兩種類別在每個交易開始時都處於指定的模式,但它們的行為可以在交易中使用 SET CONSTRAINTS 來變更。

具有約束條件名稱清單的 SET CONSTRAINTS 僅變更這些約束條件的模式(這些約束條件必須都是可延遲的)。每個約束條件名稱都可以使用 schema 限定。如果沒有指定 schema 名稱,則使用目前的 schema 搜尋路徑來尋找第一個相符的名稱。SET CONSTRAINTS ALL 變更所有可延遲約束條件的模式。

SET CONSTRAINTS 將約束條件的模式從 DEFERRED 變更為 IMMEDIATE 時,新模式會追溯生效:任何未完成的資料修改,本應在交易結束時檢查,都改為在執行 SET CONSTRAINTS 指令期間檢查。如果違反任何此類約束條件,SET CONSTRAINTS 將會失敗(且不會變更約束條件模式)。因此,SET CONSTRAINTS 可用於強制在交易中的特定時間點發生約束條件檢查。

目前,只有 UNIQUEPRIMARY KEYREFERENCES (foreign key) 和 EXCLUDE 約束條件會受到此設定的影響。NOT NULLCHECK 約束條件總是在插入或修改列時立即檢查(不是 在陳述式結束時)。尚未宣告為 DEFERRABLE 的唯一性和排除約束條件也會立即檢查。

宣告為約束條件觸發程序的觸發程序的觸發也由此設定控制 — 它們會在應該檢查相關約束條件的同一時間觸發。

注意事項

由於 PostgreSQL 不要求約束條件名稱在 schema 內必須唯一(但每個資料表必須唯一),因此指定的約束條件名稱可能有多個相符項目。在這種情況下,SET CONSTRAINTS 將對所有相符項目執行操作。對於非 schema 限定的名稱,一旦在搜尋路徑中的某些 schema 中找到一個或多個相符項目,就不會搜尋路徑中稍後出現的 schema。

此指令只會變更目前交易中約束條件的行為。在交易區塊之外發出此指令會發出警告,否則沒有任何作用。

相容性

此指令符合 SQL 標準中定義的行為,但有限制,即在 PostgreSQL 中,它不適用於 NOT NULLCHECK 約束條件。此外,PostgreSQL 會立即檢查不可延遲的唯一性約束條件,而不是像標準建議的那樣在陳述式結束時檢查。

提交更正

如果您在文件中發現任何不正確、與特定功能的使用經驗不符或需要進一步說明的內容,請使用此表單回報文件問題。