バージョンごとのドキュメント一覧

SET CONSTRAINTS

SET CONSTRAINTS <refpurpose>set constraint check timing for the current transaction</refpurpose> — 現在のトランザクションの制約検査のタイミングを設定する

概要

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

説明

<title>Description</title>

<command>SET CONSTRAINTS</command> sets the behavior of constraint checking within the current transaction. <literal>IMMEDIATE</literal> constraints are checked at the end of each statement. <literal>DEFERRED</literal> constraints are not checked until transaction commit. Each constraint has its own <literal>IMMEDIATE</literal> or <literal>DEFERRED</literal> mode. SET CONSTRAINTSは、現在のトランザクションにおける制約検査の動作を設定します。 IMMEDIATE制約は、1つの文の実行が終わるごとに検査されます。 DEFERRED制約は、トランザクションがコミットされるまで検査されません。 全ての制約は、IMMEDIATEDEFERREDのどちらかのモードを持ちます。

Upon creation, a constraint is given one of three characteristics: <literal>DEFERRABLE INITIALLY DEFERRED</literal>, <literal>DEFERRABLE INITIALLY IMMEDIATE</literal>, or <literal>NOT DEFERRABLE</literal>. The third class is always <literal>IMMEDIATE</literal> and is not affected by the <command>SET CONSTRAINTS</command> command. The first two classes start every transaction in the indicated mode, but their behavior can be changed within a transaction by <command>SET CONSTRAINTS</command>. 制約にはその生成時点で、DEFERRABLE INITIALLY DEFERREDDEFERRABLE INITIALLY IMMEDIATENOT DEFERRABLEの3つのうちのいずれかの性質が与えられます。 3番目のNOT DEFERRABLE制約は、常にIMMEDIATEモードであり、SET CONSTRAINTSコマンドの影響を受けません。 DEFERRABLE INITIALLY DEFERRED制約とDEFERRABLE INITIALLY IMMEDIATE制約の2つは、トランザクションを指定されたモードで開始しますが、トランザクション内でSET CONSTRAINTSを使用するとその振舞いを変更することができます。

<command>SET CONSTRAINTS</command> with a list of constraint names changes the mode of just those constraints (which must all be deferrable). Each constraint name can be schema-qualified. The current schema search path is used to find the first matching name if no schema name is specified. <command>SET CONSTRAINTS ALL</command> changes the mode of all deferrable constraints. SET CONSTRAINTSに制約名のリストをつけて実行すると、指定された制約(これらは全て遅延可能でなければなりません)のみのモードが変更されます。 制約名はそれぞれスキーマ修飾可能です。 スキーマ名が指定されていない場合、現在のスキーマ検索パスを使用して、最初に一致する名前を見つけます。 SET CONSTRAINTS ALLは遅延可能な全ての制約のモードを変更します。

When <command>SET CONSTRAINTS</command> changes the mode of a constraint from <literal>DEFERRED</literal> to <literal>IMMEDIATE</literal>, the new mode takes effect retroactively: any outstanding data modifications that would have been checked at the end of the transaction are instead checked during the execution of the <command>SET CONSTRAINTS</command> command. If any such constraint is violated, the <command>SET CONSTRAINTS</command> fails (and does not change the constraint mode). Thus, <command>SET CONSTRAINTS</command> can be used to force checking of constraints to occur at a specific point in a transaction. SET CONSTRAINTSが制約のモードをDEFERREDからIMMEDIATEに変更した場合は、新しい制約モードが遡及的に有効になります。 つまり、トランザクションの終了時に検査される予定だった未検査のデータ変更が、SET CONSTRAINTSコマンドの実行中に検査されます。 もし、この時に何らかの制約違反があった場合、SET CONSTRAINTSは失敗します (そして、制約モードは変更されません)。 したがって、SET CONSTRAINTSを利用すれば、トランザクションの特定の時点で強制的に制約の検査を実行することができます。

Currently, only <literal>UNIQUE</literal>, <literal>PRIMARY KEY</literal>, <literal>REFERENCES</literal> (foreign key), and <literal>EXCLUDE</literal> constraints are affected by this setting. <literal>NOT NULL</literal> and <literal>CHECK</literal> constraints are always checked immediately when a row is inserted or modified (<emphasis>not</emphasis> at the end of the statement). Uniqueness and exclusion constraints that have not been declared <literal>DEFERRABLE</literal> are also checked immediately. 現在UNIQUEPRIMARY KEYREFERENCES(外部キー)、EXCLUDE制約のみがこの設定の影響を受けます。 NOT NULLおよびCHECK制約は、行が挿入または変更された時に(文の終了時ではありません)、常に即座に検査されます。 DEFERRABLE宣言されていない一意性制約および排除制約も即座に検査されます。

The firing of triggers that are declared as <quote>constraint triggers</quote> is also controlled by this setting &mdash; they fire at the same time that the associated constraint should be checked. また、制約トリガとして宣言されたトリガの発行もこの設定により制御されます。 これらは関連する制約が検査されるはずの時に同時に発行されます。

注釈

<title>Notes</title>

Because <productname>PostgreSQL</productname> does not require constraint names to be unique within a schema (but only per-table), it is possible that there is more than one match for a specified constraint name. In this case <command>SET CONSTRAINTS</command> will act on all matches. For a non-schema-qualified name, once a match or matches have been found in some schema in the search path, schemas appearing later in the path are not searched. PostgreSQLでは、スキーマ内で制約名が一意となることを要求していません(テーブル単位での一意性のみ要求します)ので、指定した制約名に複数が一致する可能性があります。 この場合SET CONSTRAINTSは一致するすべてに対して動作します。 スキーマ修飾がない名前では、検索パス上のあるスキーマに1つまたは複数の一致があると、パス上のそれより後にあるスキーマは検索されません。

This command only alters the behavior of constraints within the current transaction. Issuing this outside of a transaction block emits a warning and otherwise has no effect. このコマンドが変更するのは、現在のトランザクション内の制約の動作のみです。 トランザクションブロックの外部でこのコマンドが実行されても、警告を発するだけで、他には何の効果もありません。

互換性

<title>Compatibility</title>

This command complies with the behavior defined in the SQL standard, except for the limitation that, in <productname>PostgreSQL</productname>, it does not apply to <literal>NOT NULL</literal> and <literal>CHECK</literal> constraints. Also, <productname>PostgreSQL</productname> checks non-deferrable uniqueness constraints immediately, not at end of statement as the standard would suggest. このコマンドは、標準SQLで定義された動作に準拠しています。 ただし、PostgreSQLではNOT NULLおよびCHECK制約に適用できないという制限があります。 またPostgreSQLは非遅延一意性制約を、標準が提案する文の終わりにではなく、即座に検査します。