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;

我得到一个错误。为什么 Postgres 在退出BEGIN END块时强制进行约束检查?不应该在事务结束时检查约束吗?我怎样才能改变这种行为?

4

1 回答 1

2

END是手册中记录的同义词COMMIT

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

因此,在第一个示例中,您启动一​​个事务,插入冲突的行并进行回滚。

在第二个示例中,您启动一​​个事务,然后启动另一个事务(因为BEGIN是 的同义词START TRANSACTION),然后尝试通过运行来提交插入END,然后进行回滚。

于 2012-05-02T18:10:17.180 回答