在 BEFORE INSERT OR UPDATE 上触发一次或两次?

Trigger on BEFORE INSERT OR UPDATE fired once or twice?

我创建了以下触发器;

CREATE TRIGGER material_trigger
    BEFORE INSERT OR UPDATE ON materials
    FOR EACH ROW
    EXECUTE PROCEDURE my_proc ();

我很难理解什么时候 my_proc 会在 upsert 查询中 运行,如下所示:

--UPSERT
INSERT INTO materials (id, col)
VALUES (1, 1)
ON CONFLICT (id) DO UPDATE SET
col='x'

如果我正在 运行 更新插入,我认为是否正确:

那么逻辑上如果我 运行 这个 AFTER upsert 我会确保 my_proc 只被触发一次?

在执行 UPDATE 的情况下,触发器实际上被触发了 两次 。这可以使用以下内容进行演示:

-- create table
CREATE TABLE IF NOT EXISTS example (uuid int unique);
-- create function
CREATE OR REPLACE FUNCTION print_function ()
    RETURNS TRIGGER
    AS $body$
    BEGIN
    RAISE NOTICE 'Starting';
    RAISE NOTICE 'METHOD: %' , TG_OP;
    RETURN NEW;
    END;
    
    $body$
    LANGUAGE plpgsql;
-- create trigger function
CREATE TRIGGER example_trigger
    BEFORE INSERT OR UPDATE ON example
    FOR EACH ROW
    EXECUTE PROCEDURE print_function ();
--  upserts
INSERT INTO example(uuid) VALUES (1) ON CONFLICT(uuid) DO UPDATE SET uuid=5;
INSERT INTO example(uuid) VALUES (1) ON CONFLICT(uuid) DO UPDATE SET uuid=5;

给出输出:

NOTICE:  Starting
NOTICE:  METHOD: INSERT             -- Populated with inital value
NOTICE:  Starting
NOTICE:  METHOD: INSERT             -- Fired a first time for insert (can't insert as exists)
NOTICE:  Starting
NOTICE:  METHOD: UPDATE             -- Fired a second time for update
INSERT 0 1