この記事では、SET CONSTRAINTSの構文と関連する説明を紹介します。
説明
SET CONSTRAINTSは、現在のトランザクション内の制約チェックの動作を設定します。 IMMEDIATE 制約は、各文の最後にチェックされます。 DEFERRED制約は、トランザクションコミットまでチェックされません。 各制約には独自の IMMEDIATE または DEFERRED モードがあります。
作成時に、制約には、DEFERRABLE INITIALLY DEFERRED、DEFERRABLE INITIALLY IMMEDIATE、またはNOT DEFERRABLEの3つの特性のうちの1つが与えられる。 3 番目のクラスは常に IMMEDIATE で、これは SET CONSTRAINTS コマンドの影響を受けません。 最初の2つのクラスは、指定されたモードですべてのトランザクションを開始しますが、SET CONSTRAINTSによってトランザクション内でその動作を変更できます。
制約名のリストを持つSET CONSTRAINTSは、それらの制約 (すべて延期可能でなければならない) だけのモードを変更します。 各制約名は、スキーマ修飾することができる。 現在のスキーマ検索パスは、スキーマ名が指定されていない場合に最初に一致する名前を見つけるために使用されます。 SET CONSTRAINTS ALLは、すべての延期可能な制約のモードを変更します。
SET CONSTRAINTSが制約のモードをDEFERINGからIMMEDIATEに変更すると、新しいモードが遡及的に有効になります。トランザクションの最後にチェックされた未処理のデータ変更は、SET CONSTRAINTSコマンドの実行中にチェックされます。 このような制約に違反した場合、SET CONSTRAINTSは失敗します (制約モードは変更しません) 。 したがって、SET CONSTRAINTSを使用して、トランザクションの特定の時点で制約を強制的にチェックすることができます。
現在、UNIQUE、PRIMARY KEY、REFERENCES (外部キー) 、およびEXCLUDE制約のみがこの設定の影響を受けます。 NOT NULLおよびCHECK制約は、行が挿入または変更されたときに常にチェックされます (ステートメントの最後ではありません) 。 DEFERRABLEと宣言されていない一意性および除外制約もすぐにチェックされます。
「制約トリガ」として宣言されたトリガの発火もこの設定によって制御され、関連する制約がチェックされるのと同時に発火する。
概要
SET CONSTRAINTS {すべて | name [, ...] } {DEFERRED | 即時}注
PolarDBは、制約名がスキーマ内で一意である必要はないため (テーブルごとにのみ) 、指定された制約名に複数の一致がある可能性があります。 この場合、SET CONSTRAINTSはすべての試合に作用します。 非スキーマ修飾名の場合、検索パス内のいくつかのスキーマで一致が見つかると、パスの後に表示されるスキーマは検索されません。
このコマンドは、現在のトランザクション内の制約の動作のみを変更します。 トランザクションブロックの外部でこれを発行すると、警告が発せられ、そうでなければ効果がない。