この質問は何年も経ちましたが、スペイン語話者のために、Postgresでテストが行われたことを明確にしたいと思います。
次の制約が1337レコードのテーブルに追加されました。キットは主キーです。
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
これにより、テーブルのNOT DEFERREDのデフォルトのプライマリキーが作成されるため、次のUPDATEを試行するとエラーが発生します。
update ele_kitscompletos
set div_nkit = div_nkit + 1;
エラー:重複キーは一意性制限«unique_div_nkit»に違反しています
Postgresでは、各行に対してUPDATEを実行すると、RESTRICTIONまたはCONSTRAINTが満たされていることが確認されます。
CONSTRAINT IMMEDIATEが作成され、各ステートメントが個別に実行されます。
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY IMMEDIATE
**Bloque 2**
BEGIN;
UPDATE ele_kitscompletos set div_nkit = div_nkit + 1;
INSERT INTO public.ele_kitscompletos(div_nkit, otro_campo)
VALUES
(1338, '888150502');
COMMIT;
クエリOK、影響を受ける行0(実行時間:0ミリ秒、合計時間:0ミリ秒)クエリOK、影響を受ける1328行(実行時間:858ミリ秒、合計時間:858ミリ秒)エラー:llave重複した複製:Ya presente la llave(div_nkit)=(1338)。
ここでは、最初の完全な文全体(1328行)を実行するため、SIでは主キーを変更できます。しかし、トランザクション(BEGIN)にありますが、CONSTRAINTは、COMMITを実行せずに各文を終了するとすぐに検証されるため、INSERTの実行時にエラーが生成されます。最後に、次の操作を実行してCONSTRAINT DEFERREDを作成しました。
**Bloque 3**
ALTER TABLE public.ele_edivipol
DROP CONSTRAINT unique_div_nkit RESTRICT;
ALTER TABLE ele_edivipol
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY DEFERRED
**ブロック2 **の各文を各文ごとに個別に実行すると、検証は行われませんが、矛盾が見つかった場所で最終的なCOMMITが実行されるため、INSERTに対してエラーは生成されません。
英語の完全な情報については、リンクを確認することをお勧めします。
遅延可能なSQL制約の詳細
DEFERRABLEではなくDEFERRABLEの初期状態