SET CONSTRAINTS <refpurpose>set constraint check timing for the current transaction</refpurpose> — 現在のトランザクションの制約検査のタイミングを設定する
SET CONSTRAINTS { ALL | name
[, ...] } { DEFERRED | IMMEDIATE }
<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
制約は、トランザクションがコミットされるまで検査されません。
全ての制約は、IMMEDIATE
かDEFERRED
のどちらかのモードを持ちます。
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 DEFERRED
、DEFERRABLE INITIALLY IMMEDIATE
、NOT 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.
現在UNIQUE
、PRIMARY KEY
、REFERENCES
(外部キー)、EXCLUDE
制約のみがこの設定の影響を受けます。
NOT NULL
およびCHECK
制約は、行が挿入または変更された時に(文の終了時ではありません)、常に即座に検査されます。
DEFERRABLE
宣言されていない一意性制約および排除制約も即座に検査されます。
The firing of triggers that are declared as <quote>constraint triggers</quote> is also controlled by this setting — they fire at the same time that the associated constraint should be checked. また、「制約トリガ」として宣言されたトリガの発行もこの設定により制御されます。 これらは関連する制約が検査されるはずの時に同時に発行されます。
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. このコマンドが変更するのは、現在のトランザクション内の制約の動作のみです。 トランザクションブロックの外部でこのコマンドが実行されても、警告を発するだけで、他には何の効果もありません。
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は非遅延一意性制約を、標準が提案する文の終わりにではなく、即座に検査します。