单个查询删除没有InnoDB关系的多个记录(使用JOIN?)

时间:2014-12-31 14:16:37

标签: mysql sql join sql-delete

问题: 我有2个相当大的表:message(+20万条记录~11GB)和message_subject(1400万条记录~3GB)需要“清理”。

如果邮件有主题,我需要删除超过2周的所有邮件以及相应的message_subjects,但重要的是要注意并非所有邮件都有主题且邮件超过2周没有主题也需要删除。

这两个表没有通过InnoDB指定的关系,即使message_subject具有字段message_id

如果在ON DELETE CASCADE的2个表格之间指定了关系,我可以从message中删除该记录,并自动删除相应的message_subject,但这不是情况下。

我尝试过:

DELETE message, message_subject
FROM message
INNER JOIN faq 
WHERE message.id = message_subject.message_id 
AND message.add_date < DATE_SUB(CURDATE(),INTERVAL 2 WEEK)

删除包含主题的邮件;没有主题的超过2周的邮件不会被删除。

DELETE message, message_subject
FROM message
INNER JOIN message_subject
      ON message.id = message_subject.message_id 
WHERE message.add_date < DATE_SUB(CURDATE(),INTERVAL 2 WEEK)

与第一个查询完全相同;没有主题,它不会删除旧邮件。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

感谢sgeddes&#39;评论,我能够使用以下查询解决问题:

DELETE message, message_subject
FROM message
LEFT OUTER JOIN message_subject
      ON message.id = message_subject.message_id 
WHERE message.add_date < DATE_SUB(CURDATE(),INTERVAL 2 WEEK)

显然与

相同
DELETE message, message_subject
FROM message
LEFT JOIN message_subject
      ON message.id = message_subject.message_id 
WHERE message.add_date < DATE_SUB(CURDATE(),INTERVAL 2 WEEK)