MySQL跨表更新触发#1093错误,匹配304行无法执行如何解决?
解决MySQL #1093 更新错误的两种实用方法
这个问题我太熟悉了!MySQL抛出的#1093错误核心原因很明确:它不允许你在更新某张表的同时,直接把这张表作为子查询的数据源使用——简单说就是同一张表不能既当「更新目标」又当「查询来源」直接出现在语句里。
先还原下你可能写的错误SQL(类似这样)
你大概率是写了类似下面的语句,直接在子查询里引用了要更新的KassaticketRegels表:
UPDATE KassaticketRegels SET prijs = (SELECT prijs FROM KassaticketRegels WHERE ticket_id = 123) WHERE order_id = 456;
方法一:把子查询包装成临时表
给子查询加一层包装,让MySQL把它当成临时表处理,这样就能避开同表冲突的限制:
UPDATE KassaticketRegels t1 SET t1.prijs = ( SELECT t2.prijs FROM (SELECT * FROM KassaticketRegels) t2 WHERE t2.ticket_id = 123 ) WHERE t1.order_id = 456;
这里的关键是(SELECT * FROM KassaticketRegels) t2,MySQL会先执行这个子查询生成临时表t2,再用它来给目标表t1更新数据,两者就不会冲突了。
方法二:用JOIN改写UPDATE(更推荐)
这是更高效、更清晰的写法,通过给表起不同别名,用JOIN关联来区分「目标表」和「数据源表」:
UPDATE KassaticketRegels t1 JOIN KassaticketRegels t2 ON t1.order_id = t2.order_id -- 这里写你的匹配逻辑 SET t1.prijs = t2.prijs, t1.aantal = t2.aantal -- 列出所有要更新的字段 WHERE t2.ticket_id = 123; -- 过滤条件
这种写法不仅能解决错误,执行效率也比子查询更高,逻辑上也更直观,非常适合批量更新场景。
你提到模拟查询时匹配了304行,说明你的业务逻辑是没问题的,只是语法触发了MySQL的限制,改成上面两种写法之一就能正常执行了。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

