PostgreSQL INSERT触发器中NEW.user_id无法获取新插入行值问题
问题原因
- PostgreSQL创建触发器时未显式声明
FOR EACH ROW的情况下,默认触发规则为FOR EACH STATEMENT(语句级触发),这类触发器仅在执行对应SQL语句的前后触发一次,不会生成存储单行插入/更新/删除数据的NEW/OLD变量,你当前代码中读取的NEW.user_id实际为null值,因此CTE查询无匹配结果,后续更新不会执行。 - 额外优化点:你当前的触发器函数不需要额外查询
test_user表,NEW变量本身已经存储了新插入行的所有字段值,直接调用即可减少不必要的表查询开销。
修复方案
1. 修改触发器创建语句,指定为行级触发
CREATE TRIGGER test_trigger AFTER INSERT ON test_user FOR EACH ROW EXECUTE FUNCTION test_trigger();
2. (可选)优化触发器函数,省略冗余查询
CREATE OR REPLACE FUNCTION test_trigger() RETURNS trigger language plpgsql AS $$ BEGIN UPDATE test_username SET money_counter = money_counter + 1, total_revenue = total_revenue + NEW.revenue WHERE username = NEW.username; RETURN NULL; END; $$
修改完成后重新执行插入测试即可看到test_username表数据正常更新。
内容的提问来源于stack exchange,提问作者WHOATEMYNOODLES
相关产品推荐
相关产品推荐

