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
相关产品推荐
相关产品推荐

