PostgreSQL 9.0.0文書
前のページ | 巻戻し |  | 早送り | 次のページ

# SET CONSTRAINTS

## 名前

SET CONSTRAINTS -- 現在のトランザクションの制約検査のタイミングを設定する

## 概要

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

## 説明

`SET CONSTRAINTS`は、現在のトランザクションにおける制約の検査方法を設定します。 `IMMEDIATE`制約は、1つの文の実行が終わるごとに検査されます。 `DEFERRED`制約は、トランザクションがコミットされるまで検査されません。 全ての制約は、`IMMEDIATE`か`DEFERRED`のどちらかのモードを持ちます。

制約にはその生成時点で、`DEFERRABLE INITIALLY DEFERRED`、`DEFERRABLE INITIALLY IMMEDIATE`、`NOT DEFERRABLE`の3つのうちのいずれかの性質が与えられます。 3番目の`NOT DEFERRABLE`制約は、常に`IMMEDIATE`モードであり、`SET CONSTRAINTS`コマンドの影響を受けません。 `DEFERRABLE INITIALLY DEFERRED`制約と`DEFERRABLE INITIALLY IMMEDIATE`制約の2つは、トランザクションを指定されたモードで開始しますが、トランザクション内で`SET CONSTRAINTS`を使用するとその振舞いを変更することができます。

制約名のリストを持った`SET CONSTRAINTS`が変更するのは、これらの制約のモードのみです （これらは全て遅延可能です）。 制約名はそれぞれスキーマ修飾可能です。 スキーマ名が指定されていない場合、最初に一致する名前を見つけ出すために現在のスキーマ検索パスが使用されます。 `SET CONSTRAINTS ALL`は遅延可能な全ての制約のモードを変更します。

制約のモードを`DEFERRED`から`IMMEDIATE`に変更した場合は、新しい制約モードが遡及的に有効になります。 つまり`DEFERRED`モードであればトランザクションの終了時に検査される未検査のデータ変更が、`SET CONSTRAINTS`コマンドの実行中に検査されます。 もし、この時に何らかの制約違反があった場合、`SET CONSTRAINTS`は失敗します （そして、制約モードは変更されません）。 したがって、`SET CONSTRAINTS`を利用すれば、トランザクションの特定の時点で強制的に制約の検査を実行することができます。

現在`UNIQUE`、`PRIMARY KEY`、`REFERENCES`（外部キー）、`EXCLUDE`制約のみがこの設定の影響を受けます。 `NOT NULL`および`CHECK`制約は、行が挿入または変更された時に（文の終了時ではありません）、常に即座に検査されます。 `DEFERRABLE`宣言されていない一意性制約および排除制約も即座に検査されます。

また、"制約トリガ"として宣言されたトリガの発行もこの設定により制御されます。 これらは関連する制約が検査されるはずの時に同時に発行されます。

## 注釈

PostgreSQLでは、スキーマ内で制約名が一意となることを要求していません（テーブル単位での一意性を要求します）ので、指定した制約名に複数が一致する可能性があります。 この場合`SET CONSTRAINTS`は一致するすべてに対して動作します。 スキーマ修飾がない名前では、検索パス上のあるスキーマで1つまたは複数の一致があると、パス上で後に見つかったスキーマは無視されます。

このコマンドが変更するのは、現在のトランザクション内の制約の動作のみです。 したがって、トランザクションブロック（`BEGIN`/`COMMIT`の間）の外部でこのコマンドが実行されても場合、何ら効果はありません。

## 互換性

このコマンドは、標準SQLで定義された動作に準拠しています。 ただし、PostgreSQLでは`NOT NULL`および`CHECK`制約に適用できないという制限があります。 またPostgreSQLは非遅延一意性制約を、標準が提案する文の終わりにではなく、即座に検査します。

前のページ | ホーム | 次のページ
SET | 上に戻る | SET ROLE