他の(正しい)回答とは別に、PostgreSQLについて話すときは、次のように述べる必要があります。
で、NOT DEFERRABLE各行が挿入/更新時にチェックされます
DEFERRABLE(現在IMMEDIATE)すべての行が挿入/更新の終了時にチェックされます
DEFERRABLE(現在はDEFERRED)すべての行は、トランザクションの終了時にチェックされます
したがって、DEFERRABLE制約がIMMEDIATEに設定されている場合、DEFERRABLE制約はNOT DEFERRABLE制約のように機能すると言うのは正しくありません。
この違いについて詳しく説明しましょう。
CREATE TABLE example(
row integer NOT NULL,
col integer NOT NULL,
UNIQUE (row, col) DEFERRABLE INITIALLY IMMEDIATE
);
INSERT INTO example (row, col) VALUES (1,1),(2,2),(3,3);
UPDATE example SET row = row + 1, col = col + 1;
SELECT * FROM example;
これは正しく出力します:

しかし、DEFERRABLE INITIALLY IMMEDIATE命令を削除すると、
エラー:重複するキー値が一意の制約「example_row_col_key」に違反しています詳細:キー( "row"、col)=(2、2)はすでに存在します。**********エラー**********
エラー:重複するキー値が一意の制約 "example_row_col_key"に違反していますSQL状態:23505詳細:キー( "row"、col)=(2、2)は既に存在します。
補遺 (2017年10月12日)
この振る舞いは確かに、ここのセクション「互換性」に文書化されています:
また、PostgreSQLは、標準が示唆するようにステートメントの最後ではなく、遅延できない一意性制約をすぐにチェックします。
DEFERRABLE制約の延期は価値のある、または必要なアクションであるという設計者の意図を示します。これは、データベースの制約とラベル付けの大部分には当てはまりませんDEFERRABLE。この有用な区別が失われるからです。