2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 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 可用於強制在事務中的特定點進行約束檢查。

目前,只有 UNIQUEPRIMARY KEYREFERENCES(外部索引鍵)和 EXCLUDE 約束會受到此設定的影響。NOT NULLCHECK 約束總是在插入或修改行時立即檢查(不是在語句結束時)。未宣告為 DEFERRABLE 的唯一性和排除約束也會立即檢查。

宣告為約束觸發器的觸發器的觸發也受此設定控制——它們會在關聯約束應被檢查的同時觸發。

註釋

由於 PostgreSQL 不要求模式內的約束名稱唯一(只要求表內唯一),因此可能存在一個指定約束名稱的多個匹配項。在這種情況下,SET CONSTRAINTS 將會作用於所有匹配項。對於非模式限定的名稱,一旦在搜尋路徑中的某個模式中找到一個或多個匹配項,將不再搜尋路徑中靠後的模式。

此命令僅會改變當前事務中約束的行為。在事務塊外發出此命令會發出警告,但除此之外沒有其他影響。

相容性

此命令遵循 SQL 標準定義的行為,除了一個限制:在 PostgreSQL 中,它不適用於 NOT NULLCHECK 約束。此外,PostgreSQL 會立即檢查不可推遲的唯一性約束,而不是在語句結束時檢查,這一點與標準建議不同。

提交更正

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