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

PostgreSQL布尔更新触发器故障:球员大学承诺变更未触发插入

解决PostgreSQL触发器未触发插入的问题

你的触发器逻辑核心条件写反了,这就是更新状态为TRUE时无数据插入的原因。

当前代码判断的是OLD.col_commit = TRUE,这意味着只有当球员原本就处于承诺状态时才会执行插入——但你的需求是状态从FALSE变为TRUE时插入,逻辑完全搞反了。

修正后的代码

CREATE OR REPLACE FUNCTION commitment_log()
RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
    BEGIN
        -- 仅当状态从FALSE切换为TRUE时执行插入
        IF OLD.col_commit = FALSE AND NEW.col_commit = TRUE THEN
            INSERT INTO commitment(player_id, committed_date)
            VALUES (NEW.player_id, now());
        END IF;
        
        RETURN NEW;
    END;
$$;

CREATE TRIGGER commitment_trigger
BEFORE UPDATE
ON player
FOR EACH ROW
EXECUTE PROCEDURE commitment_log();

关键说明

  • 新增NEW.col_commit = TRUE的判断,确保只有状态切换到承诺时才触发插入,避免重复插入(比如球员已是TRUE状态后更新其他字段时不会误操作)
  • NEW.player_id和OLD.player_id效果一致,更新操作不会改变球员ID,选哪个都可以
  • 触发器用BEFORE UPDATE或AFTER UPDATE都能满足需求,当前写法没问题

测试时执行类似语句验证:

UPDATE player SET col_commit = TRUE WHERE player_id = 123;

此时commitment表就能看到对应的插入记录了。

内容的提问来源于stack exchange,提问作者Dominick Munson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:15:15