【发布时间】:2016-12-29 10:49:35
【问题描述】:
我有一个 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()
【问题讨论】:
标签: sql postgresql triggers primary-key sql-insert