我想要的是:在插入失败时重置序列sq_nxtval的值
我做了什么:
create sequence sq_nxtval
start 1
increment 1;
create table tbl_nxtval(
a int default nextval('sq_nxtval'),
b int,
constraint tbl_nxtval1 check (b = 1)
);
create or replace function fx_nxtval () returns trigger as
$$
begin
perform setval('sq_nxtval',currval('sq_nxtval')-1);
return null;
end
$$ language plpgsql;
create trigger tg_nxtval
before insert on tbl_nxtval
for each row
execute procedure fx_nxtval ();
然后我尝试了这个:插入符合约束的值
insert into tbl_nxtval (b) values (1);
结果:
Query returned successfully: 0 rows affected, 76 ms execution time.
然后我检查了序列的当前值
select currval('sq_nxtval');
结果:1
我在第一个例子中的期望是必须将值插入表tbl_nxtval
并且触发器不会执行。
然后我尝试了这个:插入一个不符合约束的值
insert into tbl_nxtval (b) values (2);
结果:
Query returned successfully: 0 rows affected, 25 ms execution time.
然后我检查了序列的当前值
select currval('sq_nxtval');
结果:1
我在第二个例子中的期望是不会将值插入表tbl_nxtval并且触发器执行。