PostgreSQL 如何忽略事务中错误

在 PostgreSQL 的事务中;执行的SQL遇到错误(书写,约束限制);该事务的已经执行的SQL都会进行rollback。那如何忽略其中的错误。将SQL执行到底?在事务中设置 ON_ERROR_ROLLBACK 即可。

下面演示

1|01、未作任何设置

演示脚本

begin; -- 1、创建表tbl_test_01 create table tbl_test_01(id int primary key, info text); -- 2、插入异常数据 insert into tbl_test_01 values ('hello', 'PostgreSQL'); -- 3、插入正常数据 insert into tbl_test_01 values (1001, 'PostgreSQL'); end;

执行过程

postgres=# begin; BEGIN postgres=# create table tbl_test_01(id int primary key, info text); CREATE TABLE postgres=# insert into tbl_test_01 values ('hello', 'PostgreSQL'); ERROR:  invalid input syntax for type integer: "hello" LINE 1: insert into tbl_test_01 values ('hello', 'PostgreSQL');                                         ^ postgres=# insert into tbl_test_01 values (1001, 'PostgreSQL'); ERROR:  current transaction is aborted, commands ignored until end of transaction block postgres=# end; ROLLBACK postgres=# \d tbl_test_01 Did not find any relation named "tbl_test_01".

执行结果

  • 执行结果是ROLLBACK
  • 执行的正常SQL也ROLLBACK

2|02、设置 ON_ERROR_ROLLBACK

演示脚本

begin; \set ON_ERROR_ROLLBACK interactive create table tbl_test_01(id int primary key, info text); insert into tbl_test_01 values ('hello', 'PostgreSQL'); insert into tbl_test_01 values (1001, 'PostgreSQL'); end;

执行过程

postgres=# begin; BEGIN postgres=# \set ON_ERROR_ROLLBACK interactive postgres=# create table tbl_test_01(id int primary key, info text); CREATE TABLE postgres=# insert into tbl_test_01 values ('hello', 'PostgreSQL'); ERROR:  invalid input syntax for type integer: "hello" LINE 1: insert into tbl_test_01 values ('hello', 'PostgreSQL');                                         ^ postgres=# insert into tbl_test_01 values (1001, 'PostgreSQL'); INSERT 0 1 postgres=# end; COMMIT postgres=# \d tbl_test_01             Table "public.tbl_test_01"  Column |  Type   | Collation | Nullable | Default  --------+---------+-----------+----------+---------  id     | integer |           | not null |   info   | text    |           |          |  Indexes:     "tbl_test_01_pkey" PRIMARY KEY, btree (id) postgres=# select * from tbl_test_01;   id  |    info     ------+------------  1001 | PostgreSQL (1 row)

执行结果

  • 执行结果是COMMIT
  • 表 tbl_test_01 成功创建
  • 数据 (1001, 'PostgreSQL') 也成功插入

__EOF__

本文作者lottu
本文链接https://www.cnblogs.com/lottu/p/14109193.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   lottu  阅读(1781)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示