PostgreSQL DEFERRED CONSTRAINTS并开始结束块

时间:2012-05-02 17:44:40

标签: postgresql constraints deferred

我有一个带有唯一约束的表,标记为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块时强制进行约束检查?在交易结束时不应该检查约束?我该如何改变这种行为?

1 个答案:

答案 0 :(得分:2)

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

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

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

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