PostgreSQL触发器和行更新
发布时间:2020-12-13 16:32:14 所属栏目:百科 来源:网络整理
导读:我正在尝试根据此触发器更新表: CREATE TRIGGER alert AFTER UPDATE ON carsFOR EACH ROWEXECUTE PROCEDURE update_cars(); 触发功能: CREATE FUNCTION update_cars()RETURNS 'TRIGGER' AS $BODY$BEGIN IF (TG_OP = 'UPDATE') THENUPDATE hello_cars SET s
我正在尝试根据此触发器更新表:
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更新. 提前致谢.
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中应该发生什么?但这是另一个问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |