【问题标题】:Postgres trigger interfering with 'on conflict do update set'Postgres 触发干扰“冲突更新集”
【发布时间】: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


    【解决方案1】:

    是的,是 return old,返回 old 是更改记录值以使用旧值更新,您可以根据需要执行 return new; 语句,我会在更新后触发,逻辑是列表版本更新后归档,更新前不归档

    【讨论】:

      猜你喜欢
      • 2014-04-24
      • 2019-02-22
      • 1970-01-01
      • 2019-09-19
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 2019-08-07
      相关资源
      最近更新 更多