请求协助解决MySQL执行DELETE操作时的Error 1093问题
解决MySQL Error 1093:DELETE操作中无法指定目标表的问题
嘿,这个问题我太熟了!MySQL有个挺烦的限制:你不能在DELETE(或者UPDATE)语句的FROM子句里直接引用要修改的目标表——哪怕你的SELECT单独跑完全没问题,一放到DELETE的IN子句里就炸。
给你两个靠谱的解决方案,选哪个都行:
方案1:用派生表包装子查询
把原来的SELECT套一层,让MySQL把它当成临时表,这样就不会和外层的redcap_data搞混了。另外我把SELECT里多余的字段去掉了,IN子句只需要record,没必要查field_name和value,能省点性能:
DELETE FROM redcap_data WHERE record IN ( SELECT record FROM ( SELECT DISTINCT redcap_data.record FROM redcap_metadata INNER JOIN redcap_data ON redcap_metadata.project_id = redcap_data.project_id INNER JOIN redcap_events_metadata ON redcap_data.event_id = redcap_events_metadata.event_id INNER JOIN redcap_events_arms ON redcap_events_metadata.arm_id = redcap_events_arms.arm_id WHERE redcap_data.project_id = '50' AND redcap_events_arms.arm_num = '6' AND redcap_data.record IN ('record_ids go here') ) AS temp_table );
方案2:用JOIN改写DELETE(更推荐)
这种方式逻辑更直观,而且大数据量下效率通常更高,直接把所有关联表和目标表做JOIN,然后删除匹配的行:
DELETE rd FROM redcap_data rd INNER JOIN redcap_metadata rm ON rm.project_id = rd.project_id INNER JOIN redcap_events_metadata rem ON rd.event_id = rem.event_id INNER JOIN redcap_events_arms rea ON rem.arm_id = rea.arm_id WHERE rd.project_id = '50' AND rea.arm_num = '6' AND rd.record IN ('record_ids go here');
重要提醒!
不管用哪个方案,执行DELETE前一定要先把WHERE条件对应的SELECT语句单独跑一遍,确认要删除的数据集完全符合预期,毕竟删数据可是不可逆的操作!
内容的提问来源于stack exchange,提问作者Poohbreezy
相关产品推荐
相关产品推荐

