我正在尝试根据此触发器更新表:
CREATE TRIGGER alert AFTER UPDATE ON cars FOR EACH ROW EXECUTE PROCEDURE update_cars();
触发功能:
CREATE FUNCTION update_cars() RETURNS 'TRIGGER' AS $BODY$ BEGIN IF (TG_OP = 'UPDATE') THEN UPDATE hello_cars SET status = new.status WHERE OLD.ID = NEW.ID; END IF; RETURN NULL; END; $$LANGUAGE plpgsql;
触发器工作正常.更新cars表时,会更新hello_cars表,但每行中的status列都会更新并包含相同的新状态!必须根据车辆ID更新.
我认为我的问题是条件:WHERE OLD.ID = NEW.ID;但我不知道出了什么问题.
提前致谢.
OLD和NEW是触发触发器的行的别名.所以当你执行一个类似的语句时
UPDATE cars SET status='xyz' WHERE cars.id = 42;
然后触发器功能将执行
UPDATE hello_cars SET status='xyz' WHERE 42 = 42
42 = 42部分始终为真.因此,hello_cars中的每一行都会更新.
你真的想要这样的东西
[...]WHERE hello_cars.id = OLD.ID
或者更短一些
[...]WHERE id = OLD.ID
但是如果初始更新改变了cars.id,你还需要考虑会发生什么.在这种情况下,OLD.ID不等于NEW.ID.在这种情况下,表hello_cars中应该发生什么?但这是另一个问题.
原文地址:https://www.jb51.cc/postgresql/191709.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。