【发布时间】:2018-01-12 06:08:37
【问题描述】:
基本上我有table_a 和table_b。 table_b 由 table_a 的特征组成,它们共享 section_id 列和状态。
table_a 的 section_id 是主键,所以是唯一的,但是 table_b 可以有多个 section_id,但它们都共享相同的状态
用户插入和更新 table_b,我想在 table_a 中捕获状态更改
CREATE TRIGGER table_b_aiu
AFTER INSERT OR UPDATE
ON table_b
FOR EACH ROW
WHEN (((new.status = 100) OR (new.status = 200)))
EXECUTE PROCEDURE table_b_aiu();
CREATE OR REPLACE FUNCTION table_b_aiu()
RETURNS trigger AS
$BODY$
BEGIN
UPDATE table_a a
SET status = 100
FROM table_b b
WHERE (b.status = 100 or b.status = 200)
AND a.section_id = b.section_id;
RETURN new;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
这样做的问题在于,它不仅更新了新更新或插入的行,还更新了整个数据集,而这并不是有意的。如何只更新新行?我试过在触发器上提出论据,但它不接受 new.section_id
【问题讨论】:
-
section_id是行的唯一标识符吗?对相关表格进行定义也会很有帮助。 -
@C.Arendt section_id 是 table_a 的主键,但不是 table_b 的主键
-
触发器上的参数是什么意思?像这样:
EXECUTE PROCEDURE table_b_aiu(new.section_id);?您可以访问该行而不将其作为参数传递。您可以简单地执行where a.section_id = new.section_id并删除from table_b,因为它不需要。 -
@ŁukaszKamiński 在删除 from 并尝试 new.section_id 后,我得到了 Provider 错误:更改属性时出现 PostGIS 错误:错误:记录“new”没有字段“sectionid”
-
不应该是
section_id而不是sectionid?
标签: sql postgresql