MySQL触发器异常:id_tingkatan_wewenang始终设为4,nomor_reference条件失效
MySQL触发器赋值覆盖问题修复方案
你的触发器中id_tingkatan_wewenang始终被设为4,核心原因是后续条件判断覆盖了前置赋值。虽然你在代码开头设置了nomor_reference非空时将id设为5,但如果NEW.tgl_keluar_verifikator IS NOT NULL条件成立,后续代码会强行把值重置为4,完全覆盖之前的设置。
要实现nomor_reference非空时优先设为5的需求,需要将该条件提升为最高优先级,并且在满足条件时跳过后续所有赋值逻辑。修复后的触发器代码如下:
BEGIN -- 最高优先级:nomor_reference非空时直接设为5,跳过后续逻辑 IF NEW.nomor_reference IS NOT NULL THEN SET NEW.id_tingkatan_wewenang = 5; LEAVE; -- 终止触发器后续逻辑执行 END IF; -- 原有的其他判断逻辑按顺序执行 IF NEW.id_tingkatan_wewenang IS NULL THEN SET NEW.id_tingkatan_wewenang = 2; END IF; IF NEW.tgl_keluar_verifikator IS NOT NULL THEN SET NEW.id_tingkatan_wewenang = 4; ELSEIF OLD.tgl_keluar_verifikator IS NOT NULL AND OLD.catatan_verifikator IS NOT NULL THEN SET NEW.id_tingkatan_wewenang=3; ELSEIF NEW.tgl_keluar_verifikator IS NOT NULL AND NEW.catatan_verifikator IS NOT NULL THEN SET NEW.id_tingkatan_wewenang=1; ELSE IF NEW.id_jumlah_total_tagihan = 1 THEN SET NEW.id_tingkatan_wewenang = 3; ELSE SET NEW.id_tingkatan_wewenang = 5; END IF; IF NEW.id_status_k3 = 1 THEN SET NEW.id_tingkatan_wewenang = 3; ELSEIF NEW.id_status_k3 = 2 THEN SET NEW.id_tingkatan_wewenang = 1; END IF; END IF; IF NEW.id_tingkatan_wewenang IS NULL THEN SET NEW.id_tingkatan_wewenang = 2; END IF; END
关键说明
- 使用
LEAVE语句在nomor_reference非空时直接终止触发器后续逻辑,避免其他条件覆盖赋值结果 - 调整了条件顺序,将核心需求逻辑放在最前端,确保优先级最高
内容的提问来源于stack exchange,提问作者Mr Brama
相关产品推荐
相关产品推荐

