PostgreSQL触发器和行更新

时间:2012-03-31 10:36:51

标签: postgresql triggers

我正在尝试根据此触发器更新表:

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;但是我不知道出了什么问题。

提前致谢。

2 个答案:

答案 0 :(得分:6)

OLD.IDNEW.ID在表cars的更新行中引用,因此(除非您更改cars中的ID )将始终评估为true,因此更新hello_cars中的所有行。

我想你可能想要:

UPDATE hello_cars
   SET status = new.status
WHERE id = new.id;

这假设表id中的列hello_carsid中的cars匹配。

答案 1 :(得分:6)

OLDNEW是触发触发器的行的别名。所以当你执行像

这样的语句时
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表中会发生什么?但这是另一个问题。