我正在尝试根据此触发器更新表:
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
表已更新,但每行中的状态列已更新并包含相同的新状态!必须根据车辆ID进行更新
我认为我的问题是有条件的:WHERE OLD.ID = NEW.ID;
但是我不知道出了什么问题。
提前致谢。
答案 0 :(得分:6)
OLD.ID
和NEW.ID
在表cars
的更新行中引用值,因此(除非您更改cars
中的ID )将始终评估为true,因此更新hello_cars中的所有行。
我想你可能想要:
UPDATE hello_cars
SET status = new.status
WHERE id = new.id;
这假设表id
中的列hello_cars
与id
中的cars
匹配。
答案 1 :(得分:6)
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
表中会发生什么?但这是另一个问题。