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

Gly*_*yph 14 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"
Run Code Online (Sandbox Code Playgroud)

尚未发出任何消息,但事务已回滚.我个人最喜欢的会议内容如下:

glyph=# commit;
ROLLBACK
Run Code Online (Sandbox Code Playgroud)

...因为" ROLLBACK"似乎是一个奇怪的成功 -消息COMMIT.但实际上,它已被回滚,表中没有行:

glyph=# select * from foo;
 bar 
-----
(0 rows)
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建大量的SAVEPOINTs并以这种方式处理SQL中的错误,但是这涉及到数据库的更多流量,更多的延迟(我可能必须处理来自SAVEPOINT之后的错误),但收益相对较小.我真的只想用我的应用程序语言处理错误(Python)try/except,所以我想从SQL中获取的唯一行为是错误不会触发自动回滚.我能做什么?

小智 2

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

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

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