PostgreSQL触发器和行更新

我正在尝试根据此触发器更新表:
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中应该发生什么?但这是另一个问题.

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...