MySQL中You can’t specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。
原来的sql:
这个错误是因为在 SQL 中不能直接在子查询中更新与主查询相同的表。
UPDATE saturn_file
SET is_delete = 1,
update_time = NOW()
WHERE id IN (
SELECT sf.id
FROM saturn_file sf
LEFT JOIN saturn_task_conf st ON sf.id = st.source_file_id
WHERE st.source_file_id IS NULL
AND sf.update_time < DATE_SUB(NOW(), INTERVAL 6 MONTH)
AND sf.create_time < DATE_SUB(NOW(), INTERVAL 6 MONTH)
);
修改后的sql:
为了解决这个问题,你可以使用一个临时表来保存子查询的结果,然后在主查询中引用该临时表。下面是修改后的 SQL 查询:
UPDATE saturn_file
SET is_delete = 1,
update_time = NOW()
WHERE id IN (
SELECT id
FROM (
SELECT sf.id
FROM saturn_file sf
LEFT JOIN saturn_task_conf st ON sf.id = st.source_file_id
WHERE st.source_file_id IS NULL
AND sf.update_time < DATE_SUB(NOW(), INTERVAL 6 MONTH)
AND sf.create_time < DATE_SUB(NOW(), INTERVAL 6 MONTH)
) AS temp
);