如何在没有违反约束的情况下将记录插入到具有before insert触发器的表中?

时间:2013-12-19 03:55:59

标签: postgresql triggers

我想要的是:在插入失败时重置序列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并且触发器执行。

  • 这里有什么问题?
  • 我是否错误地使用了触发器?
  • 我应该采取哪些不同的方法来重置序列的值?

0 个答案:

没有答案