postgresql - 当单个约束失败时,如何告诉 PostgreSQL 不要中止整个事务?

标签 postgresql

只要任何 SQL 语句以错误终止,包括任何约束违反,Postgres 都会自动中止事务。例如:

glyph=# create table foo (bar integer, constraint blug check(bar > 5));
CREATE TABLE
glyph=# begin;
BEGIN
glyph=# insert into foo values (10);
INSERT 0 1
glyph=# insert into foo values (1);
ERROR:  new row for relation "foo" violates check constraint "blug"
STATEMENT:  insert into foo values (1);
ERROR:  new row for relation "foo" violates check constraint "blug"

尚未发布任何消息,但事务已回滚。本次 session 我个人最喜欢的台词如下:

glyph=# commit;
ROLLBACK

... 因为“ROLLBACK”似乎是一个奇怪的成功-COMMIT 的消息。但是,确实回滚了,表中没有行:

glyph=# select * from foo;
 bar 
-----
(0 rows)

我知道我可以创建大量的 SAVEPOINT 并以这种方式处理 SQL 中的错误,但这涉及到数据库的更多流量,更多的延迟(我可能不得不处理来自SAVEPOINT 毕竟),但 yield 相对较小。我真的只是想用 try/except 无论如何处理我的应用程序语言(Python)中的错误,所以我想要的 SQL 的唯一行为是错误不触发自动回滚。我能做什么?

最佳答案

非常是 PostgreSQL 的新手,但 PostgreSQL 文档中有关触发器/服务器端编程的示例之一看起来完全符合您的要求。

参见:http://www.postgresql.org/docs/9.2/static/trigger-example.html

页面片段:“所以触发器充当非空约束但不会中止事务。

关于postgresql - 当单个约束失败时,如何告诉 PostgreSQL 不要中止整个事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9436122/

相关文章:

postgresql - 在 PostgreSQL 过程中使用 HTML 链接

sql - 使用 LEFT JOIN 删除

java - 从 Google map 获取坐标并将其插入 PostgreSQL

postgresql - Postgres "Materialized View"刷新为 ElasticSearch 文档更新的来源?

mongodb - Postgres 或 MongoDB

sql - 为什么 PREPARE 语句不尊重 INDEXing

sql - Rails Model.find() 不返回信息(返回散列)

database - 如何在 Windows 7 上从 Ubuntu 打开 db.dump

sql - 从两个表创建第三个表

sql - 获取表中行对之间的平均间隔