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

# SET CONSTRAINTS

## 名前

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`は、それらの制約のモードのみを変更します。 （これらは全て遅延可能でなければなりません。） 指定した名前に一致する制約が複数存在した場合、その全てが影響を受けます。 `SET CONSTRAINTS ALL`は遅延可能な制約全てに対してそのモードを変更します。

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

今のところ、外部キーの制約だけがこの設定の影響を受けます。 検査制約や一意性制約は、常に遅延されません。

## 注釈

このコマンドは、現在のトランザクション内のみの制約の動作を変更します。 したがって、トランザクションブロック(`BEGIN`/`COMMIT`の間)の外部でこのコマンドを実行した場合、全く影響を与えません。

## 互換性

このコマンドは、標準SQLで定義された動作に準拠しています。 ただし、PostgreSQLでは外部キー制約にのみ適用できるという制限があります。

標準SQLでは、`SET CONSTRAINTS`内の制約名はスキーマで修飾できるものとしています。 これはまだPostgreSQLではサポートされていません。 この名前は未修飾でなければならず、制約が存在するスキーマに関係なく、コマンドで指定したものと一致する全ての制約が影響を受けます。

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