0

としてマークされた一意の制約を持つテーブルがありますDEFERRABLE INITIALLY DEFERRED;

次に、次のクエリを実行します。

START TRANSACTION;
INSERT INTO "T" VALUES (1,2);
INSERT INTO "T" VALUES (1,2);
INSERT INTO "T" VALUES (1,2);
ROLLBACK;

そして、すべてがうまくいきます。しかし、私が実行しようとすると

START TRANSACTION;
BEGIN;
    INSERT INTO "T" VALUES (1,2);
    INSERT INTO "T" VALUES (1,2);
    INSERT INTO "T" VALUES (1,2);
END;
ROLLBACK;

エラーが発生します。BEGIN ENDブロックを終了するときにPostgresの強制制約がチェックされるのはなぜですか?トランザクションの終了時に制約をチェックするべきではありませんか?この動作を変更するにはどうすればよいですか?

4

1 に答える 1

2

ENDCOMMITマニュアルに記載されているとおりの同義語です。

http://www.postgresql.org/docs/current/static/sql-end.html

したがって、最初の例では、トランザクションを開始し、競合する行を挿入してロールバックを実行します。

2番目の例では、トランザクションを開始し、次に別のトランザクションを開始し(BEGINはの同義語であるためSTART TRANSACTION)、を実行して挿入をコミットしようとしEND、次にロールバックを実行します。

于 2012-05-02T18:10:17.180 に答える