You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:15:02