PostgreSQL SET CONSTRAINTS

2021-09-13 14:56 更新

SET CONSTRAINTS — 為當(dāng)前事務(wù)設(shè)置約束檢查時機

大綱

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

描述

SET CONSTRAINTS設(shè)置當(dāng)前事務(wù)內(nèi)約束檢查 的行為。IMMEDIATE約束在每個語句結(jié)束時被檢查。 DEFERRED約束直到事務(wù)提交時才被檢查。每個約束都有 自己的IMMEDIATEDEFERRED模式。

在創(chuàng)建時,一個約束會被給定三種特性之一: DEFERRABLE INITIALLY DEFERREDDEFERRABLE INITIALLY IMMEDIATE或者 NOT DEFERRABLE。第三類總是 IMMEDIATE并且不會受到 SET CONSTRAINTS命令的影響。前兩類在每個 事務(wù)開始時都處于指定的模式,但是它們的行為可以在一個事務(wù)內(nèi)用 SET CONSTRAINTS更改。

帶有一個約束名稱列表的SET CONSTRAINTS 只更改那些約束(都必須是可延遲的)的模式。每一個約束名稱都可以是 模式限定的。如果沒有指定模式名稱,則當(dāng)前的模式搜索路徑將被用來尋找 第一個匹配的名稱。SET CONSTRAINTS ALL 更改所有可延遲約束的模式。

當(dāng)SET CONSTRAINTS把一個約束的模式從 DEFERRED改成IMMEDIATE時, 新模式會有追溯效果:任何還沒有解決的數(shù)據(jù)修改(本來會在事務(wù)結(jié)束時 被檢查)會轉(zhuǎn)而在SET CONSTRAINTS命令 的執(zhí)行期間被檢查。如果任何這種約束被違背, SET CONSTRAINTS將會失敗(并且不會改 變該約束模式)。這樣,SET CONSTRAINTS可以被用來在一個事務(wù)中的特定點強制進(jìn) 行約束檢查。

當(dāng)前,只有UNIQUE、PRIMARY KEY、 REFERENCES(外鍵)以及EXCLUDE 約束受到這個設(shè)置的影響。 NOT NULL以及CHECK約束總是在一行 被插入或修改時立即檢查(不是在語句結(jié)束時)。 沒有被聲明為DEFERRABLE的唯一和排除約束也會被 立刻檢查。

被聲明為約束觸發(fā)器的觸發(fā)器的引發(fā)也受到這個設(shè)置 的控制 — 它們會在相關(guān)約束被檢查的同時被引發(fā)。

注解

因為PostgreSQL并不要求約束名稱在模式內(nèi) 唯一(但是在表內(nèi)要求唯一),可能有多于一個約束匹配指定的約束名稱。在這種 情況下SET CONSTRAINTS將會在所有的匹配上操作。 對于一個非模式限定的名稱,一旦在搜索路徑中的某個模式中發(fā)現(xiàn)一個或者多個匹 配,路徑中后面的模式將不會被搜索。

這個命令只修改當(dāng)前事務(wù)內(nèi)約束的行為。在事務(wù)塊外部發(fā)出這個命令會產(chǎn)生一個 警告并且也不會有任何效果。

兼容性

這個命令符合 SQL 標(biāo)準(zhǔn)中定義的行為,但有一點限制:在 PostgreSQL中,它不會應(yīng)用在 NOT NULLCHECK約束上。還有, PostgreSQL會立刻檢查非可延遲的 唯一約束,而不是按照標(biāo)準(zhǔn)建議的在語句結(jié)束時檢查。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號