MySQL使用别名更新数据触发#1093错误,寻求解决方法
解决MySQL UPDATE语句中FROM子句引用目标表的错误
你遇到的#1093错误是MySQL的典型限制:不能在UPDATE/DELETE语句的FROM子句中直接指定要更新的目标表,MySQL会认为这种操作存在数据一致性风险或歧义。
别担心,我们可以通过把目标表的子查询包装成**派生表(临时表)**的方式绕开这个限制,修改后的SQL语句完全保留你的业务逻辑,同时解决错误:
UPDATE file_associations as fa SET fa.scheduled_charge_id = NULL WHERE fa.faid IN( SELECT temp.faid FROM ( SELECT fa.faid FROM file_associations as fa JOIN maintenance_requests mr ON ( mr.cid = fa.cid AND mr.id = fa.maintenance_request_id ) JOIN scheduled_charges sc ON ( sc.cid = fa.cid AND sc.scid = fa.scheduled_charge_id ) WHERE fa.cid =235 AND fa.scheduled_charge_id IS NOT NULL AND fa.maintenance_request_id IS NOT NULL AND fa.faid IN ( 1, 7 ) ) AS temp );
关键修改说明:
- 给原本的子查询套上一层
SELECT temp.faid FROM (...) AS temp结构,temp是派生表的别名 - 外层IN子句引用的是派生表
temp中的faid,而非直接引用原更新表file_associations
MySQL会先执行内层子查询生成临时数据集,再用这个数据集过滤要更新的记录,既避开了原限制,又保证了逻辑的正确性。
内容的提问来源于stack exchange,提问作者Pranav Unde
相关产品推荐
相关产品推荐

