MySQL AFTER UPDATE触发器关联视图更新表报Not unique table/alias错误
问题原因
你出现Not unique table/alias报错的核心是混用了MySQL两种多表更新的语法:
你参考的示例写法UPDATE T1,T2 INNER JOIN T2 ON T1.C1 = T2.C1中,已经在UPDATE子句后声明了T2表,后续INNER JOIN又重复引用T2且没有设置独立别名,导致MySQL无法识别表的引用指向。
修复方案
两种正确的多表更新写法二选一即可:
写法1:JOIN结构(推荐,关联逻辑更清晰)
CREATE TRIGGER trigger1 AFTER UPDATE ON Table1 FOR EACH ROW BEGIN UPDATE Table3 t3 INNER JOIN view1 v1 ON t3.id = v1.id SET t3.results1 = v1.results1, t3.results2 = v1.results2, t3.results3 = v1.results3; END;
说明:这里给Table3和view1分别设置了别名t3、v1,避免表名重复冲突,JOIN的关联条件已经包含了匹配规则,不需要再重复写WHERE子句的关联条件。
写法2:逗号分隔+WHERE关联
CREATE TRIGGER trigger1 AFTER UPDATE ON Table1 FOR EACH ROW BEGIN UPDATE Table3 t3, view1 v1 SET t3.results1 = v1.results1, t3.results2 = v1.results2, t3.results3 = v1.results3 WHERE t3.id = v1.id; END;
优化建议
当前触发器为行级触发器,每更新Table1的一行就会全量更新所有Table3和view1匹配的记录,数据量较大时会产生严重性能损耗。建议新增过滤条件只更新和本次修改相关的记录,比如如果view1中关联了Table1的主键字段,可增加条件v1.table1_id = NEW.id(NEW代表触发器触发时,Table1更新后的行数据)。
内容的提问来源于stack exchange,提问作者aimee
相关产品推荐
相关产品推荐

