我有一个带有唯一约束的表,标记为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
块时强制进行约束检查?在交易结束时不应该检查约束?我该如何改变这种行为?
答案 0 :(得分:2)
END
是手册中记录的COMMIT
的同义词:
http://www.postgresql.org/docs/current/static/sql-end.html
因此,在第一个示例中,您启动一个事务,插入冲突的行并进行回滚。
在第二个示例中,您启动一个事务,然后启动另一个事务(因为BEGIN
是START TRANSACTION
的同义词),然后您尝试通过运行END
提交插入,然后你做了回滚。