【问题标题】:postgres INSERT trigger fires even with ON CONFLICT DO NOTHING即使使用 ON CONFLICT DO NOTHING,postgres INSERT 触发器也会触发
【发布时间】:2023-03-18 02:34:01
【问题描述】:

在几个 SO 答案(12)中,建议如果存在冲突且 ON CONFLICT DO NOTHING 在触发语句中,则不应触发 INSERT 触发器。也许我理解错了,但在我的实验中似乎并非如此。

这是我的 SQL,在 Postgres 9.6 上运行。

CREATE TABLE t (
        n text PRIMARY KEY
);

CREATE FUNCTION def() RETURNS trigger AS $$
BEGIN
        RAISE NOTICE 'Called def()';
        RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER deftrig BEFORE INSERT ON t FOR EACH ROW EXECUTE PROCEDURE def();

如果我再运行几个插入:

testdb=> insert into t (n) values ('dummy') on conflict do nothing;
NOTICE:  Called def()
INSERT 0 1
testdb=> insert into t (n) values ('dummy') on conflict do nothing;
NOTICE:  Called def()
INSERT 0 0

我本来希望第一次看到Called def(),但下次不会。

我做错了什么?

【问题讨论】:

    标签: postgresql triggers


    【解决方案1】:

    BEFORE INSERT 触发器在冲突检查之前运行。触发器有机会更改插入的值,在这种情况发生之前检查冲突是没有意义的。每the documentation:

    请注意,所有每行 BEFORE INSERT 触发器的影响都反映在排除值中,因为这些影响可能导致该行被排除在插入之外。

    AFTER INSERT 触发器的行为将如您所愿。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 2020-12-22
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      相关资源
      最近更新 更多