使用内部联接删除时出现MySQL错误(1066非唯一ID)

时间:2016-05-16 15:39:31

标签: mysql

新手的一点点,试图从两个表中删除行。我不确定如何别名 - 这似乎是我的问题 - 任何帮助都会有所帮助!

DELETE emails, emails_bodies
FROM emails, emails_bodies
INNER JOIN emails_bodies ON emails_bodies.email_id = emails.id
WHERE
emails.date_modified < "2013-01-01"

失败:

1066: Not unique table/alias: 'emails_bodies'

2 个答案:

答案 0 :(得分:1)

您对emails_bodies查询中的表DELETE有额外的引用。试试这个:

DELETE emails.*
FROM emails
INNER JOIN emails_bodies ON emails_bodies.email_id = emails.id
WHERE emails.date_modified < "2013-01-01"

我还从选择列表中删除了一个表,因为MySQL不会从一个查询中的两个不同表中删除。实现此目的的一个选择是在父表(例如emails)和子表(例如emails_bodies)之间设置级联。然后删除emails中的记录将自动删除emails_bodies中的外键引用。

至于为什么会出现Not unique table/alias错误,MySQL会将您的查询解释为以下内容:

DELETE emails, emails_bodies
FROM emails
INNER JOIN emails_bodies   -- cross join, since no ON condition given
INNER JOIN emails_bodies ON emails_bodies.email_id = emails.id
WHERE emails.date_modified < "2013-01-01"

您使用了相同的表名两次,而没有给每个名称一个唯一的别名。

答案 1 :(得分:0)

由于您加入同一个表,因此必须使用as来保持表名唯一

INNER JOIN emails_bodies as emails_bodies_joined

而不是emails_bodies在您需要加入的桌子的每个地方都使用emails_bodies_joined