更新后尝试在其自己的触发器内更新同一表时会出现常见的挑战。当触发器被设计为根据同一行中其他列的更改来修改表中的特定列时,这一点变得很明显。
考虑以下场景,其中我们希望每次得分时更新“products_score”表中的“votes_total”列已修改:
CREATE TRIGGER upd_total_votes AFTER UPDATE ON products_score FOR EACH ROW UPDATE products_score SET products_score.votes_total = (SELECT (votes_1 + votes_2 + votes_3 + votes_4 + votes_5) FROM products_score WHERE id = new.id)
但是,在对表执行更新时,我们遇到错误:
#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
此错误是由触发器逻辑中的循环引用引起的。更新语句尝试修改“votes_total”列,触发器也依赖该列来计算新的总数。
要避免此问题,我们可以将触发器修改为在更新之前而不是之后执行:
CREATE TRIGGER upd_total_votes BEFORE UPDATE ON products_score FOR EACH ROW BEGIN SET new.votes_total = new.votes_1 + new.votes_2 + new.votes_3 + new.votes_4 + new.votes_5 END ;
在这个修改后的触发器中,我们计算新的“votes_total”值并分配它在实际更新发生之前到“新”行对象。这允许更新语句继续进行而不会遇到循环引用问题。
以上是如何解决MySQL触发器导致的表更新错误?的详细内容。更多信息请关注PHP中文网其他相关文章!