创建MySQL更新触发器实现同表行更新的问题求助
解决同表触发器无限循环问题的方案
根据你的需求,要实现当tblcustomfieldsvalues表中relid匹配且fieldid=11的value满足特定值时,更新对应id的行,同时避免触发器无限循环,可按以下步骤实现:
核心思路
无限循环的根源是触发器执行同表更新时,会再次触发自身。解决关键是限定触发器仅在目标行(fieldid=11的行)插入/更新时执行,且更新的目标行不会触发触发器逻辑。
MySQL 触发器代码实现
1. 处理插入操作的触发器
DELIMITER // CREATE TRIGGER custom_field_after_insert AFTER INSERT ON tblcustomfieldsvalues FOR EACH ROW BEGIN -- 仅处理fieldid=11的新插入行 IF NEW.fieldid = 11 THEN CASE NEW.value WHEN 'some car' THEN -- 更新同relid下id=1的行,替换为你需要的新值 UPDATE tblcustomfieldsvalues SET value = '目标新值1' WHERE id = 1 AND relid = NEW.relid; WHEN 'another car' THEN -- 更新同relid下id=4的行 UPDATE tblcustomfieldsvalues SET value = '目标新值2' WHERE id = 4 AND relid = NEW.relid; -- 可继续添加更多value与对应id的匹配规则 END CASE; END IF; END // DELIMITER ;
2. 处理更新操作的触发器
如果需要监听fieldid=11行的value变更,再执行更新,添加如下触发器:
DELIMITER // CREATE TRIGGER custom_field_after_update AFTER UPDATE ON tblcustomfieldsvalues FOR EACH ROW BEGIN -- 仅当fieldid=11且value确实发生变化时执行 IF NEW.fieldid = 11 AND OLD.value != NEW.value THEN CASE NEW.value WHEN 'some car' THEN UPDATE tblcustomfieldsvalues SET value = '目标新值1' WHERE id = 1 AND relid = NEW.relid AND id != NEW.id; -- 排除当前触发行,避免循环 WHEN 'another car' THEN UPDATE tblcustomfieldsvalues SET value = '目标新值2' WHERE id = 4 AND relid = NEW.relid AND id != NEW.id; -- 更多规则 END CASE; END IF; END // DELIMITER ;
关键细节说明
- 避免循环的核心:触发器仅在
fieldid=11的行变化时触发,而更新的id=1/id=4等行(假设这些行的fieldid不是11)不会再次触发触发器;如果这些行的fieldid也是11,必须加上id != NEW.id条件,避免更新触发触发器的当前行。 - relid匹配:通过
relid = NEW.relid确保只更新同关联ID下的目标行,符合你的需求。 - 替换新值:将代码中的
'目标新值1'/'目标新值2'替换为你实际需要设置的内容。
内容的提问来源于stack exchange,提问作者Mohamed Amine LOUAHDAOUI
相关产品推荐
相关产品推荐

