为什么 postgres 触发器函数返回一些列引用不明确?

问题描述

我有两个表: 我插入或更新值的源表

CREATE TABLE test.table_1
(
    id smallint NOT NULL DEFAULT nextval('test.table_1_id_seq'::regclass),sub_id smallint,value numeric(5,5)
)

TABLESPACE pg_default;

ALTER TABLE test.table_1
    OWNER to postgres;

我需要获取 NEW 和 OLD 值之间的差异,并在更新时将其添加sum_value 中的 table_1_sum。 或者如果 idsub_id 已存在于 table_1_sum

中,则需要插入新行
CREATE TABLE test.table_1_sum
(
    id smallint,sum_value numeric(5,5),CONSTRAINT unq_constraint UNIQUE (id,sub_id)
)

TABLESPACE pg_default;

ALTER TABLE test.table_1_sum
    OWNER to postgres;

我用触发器做了一个函数来做到这一点

CREATE FUNCTION test.add_diff()
    RETURNS trigger
    LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
        delta_value   numeric;      
    BEGIN      
        IF (TG_OP = 'UPDATE') THEN            
            delta_value = NEW.value - OLD.value;        
        ELSIF (TG_OP = 'INSERT') THEN       
            delta_value = NEW.value;        
        ELSIF (TG_OP = 'DELETE') THEN       
            delta_value = -1 * OLD.value;       
        END IF;         
            INSERT INTO test.table_1_sum (
                sub_id,sum_value
                )
            VALUES (
                NEW.sub_id,NEW.value               
               )
                ON CONFLICT ON CONSTRAINT unq_constraint
                DO UPDATE 
                    SET 
                    sum_value = sum_value + delta_value;    
        RETURN NULL;
    END;
$BODY$;
ALTER FUNCTION test.add_diff()
    OWNER TO postgres;
    
    
CREATE TRIGGER add_value_diff
    AFTER INSERT OR DELETE OR UPDATE 
    ON test.table_1
    FOR EACH ROW
    EXECUTE PROCEDURE test.add_diff();

它不起作用。我不知道为什么。

它返回一个错误

ERROR: column reference "sum_value" is ambiguous LINE 13: sum_value = sum_value + delta_value

我错在哪里?

解决方法

demo:db<>fiddle

您必须在计算中明确引用 table_1_sum

sum_value = table_1_sum.sum_value + delta_value; 
,

有一个名为 EXCLUDED 的“虚拟”表,其中包含应插入值的行(当 INSERTON CONFLICT DO 子句时)。该虚拟表与目标表具有相同的结构(相同的列),因此列的名称不唯一。

您可以在相关的 Postgres documentation 中阅读更多详细信息。