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

1、未作任何设置

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');
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、设置 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');
    
    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') 也成功插入
  •