我有一个SQL插入,该插入应增加version
列并time
在主键冲突时更新该列。
insert into items (pk, time, version, name)
values (9999, now(), 1)
on conflict (pk) do update set
time = now(),
version = items.version + 1,
name = excluded.name
一切正常,直到在发生更新时我添加触发器以存档行。因此,如果存在版本为1的行,并且稍后发生插入操作,则上述查询会将version
列增加为2。但是我希望版本1的旧行进入该archive
表。
但是,当我在下面添加触发器时,上面的插入操作不会像没有此触发器时那样更新版本和时间列。如何固定扳机?是因为我正在执行return old
,还是因为它是before update
触发器?
CREATE FUNCTION archivefunction() RETURNS trigger
LANGUAGE plpgsql
AS $$
begin
insert into archive (pk, time, version, name)
values (old.pk, old.time, old.version, old.name);
return old;
end
$$
CREATE TRIGGER archivetrigger
BEFORE UPDATE ON items
FOR EACH ROW EXECUTE PROCEDURE archivefunction()
是的,对于return old
,返回old的是将记录值更改为要使用旧值更新的内容,return new;
无论如何您都可以针对自己想要的内容进行声明,而我将在更新后触发器中执行此操作,其逻辑是在列表版本更新后存档,而不在更新之前存档
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句