问题描述
我有两个表: 我插入或更新值的源表
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
。
或者如果 id
和 sub_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
我错在哪里?
解决方法
您必须在计算中明确引用 table_1_sum
:
sum_value = table_1_sum.sum_value + delta_value;
,
有一个名为 EXCLUDED
的“虚拟”表,其中包含应插入值的行(当 INSERT
有 ON CONFLICT DO
子句时)。该虚拟表与目标表具有相同的结构(相同的列),因此列的名称不唯一。
您可以在相关的 Postgres documentation 中阅读更多详细信息。