2016-05-16 106 views
1

新手的位,試圖從兩個表中刪除行。我不確定如何別名 - 這似乎是我的問題 - 任何幫助都將有所幫助!MySQL內部連接刪除錯誤(1066非唯一ID)

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' 

回答

1

您在DELETE查詢中對錶emails_bodies有額外的參考。試試這個:

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" 

您使用相同的表名兩次,沒有給每個唯一的別名。

+0

偉大的描述。您的解決方案是否會從兩個表中刪除行或只是「電子郵件」? – David

+0

@David我很急於發佈,我甚至沒有注意到你的選擇列表。不要這樣做。如果您確實需要立即從兩個表中刪除,請使用外鍵刪除級聯刪除。 –

+0

明白了,我只會運行兩個刪除查詢,因爲我不知道如何級聯。 – David

0

既然你加入,你必須使用as保持表名唯一

INNER JOIN emails_bodies as emails_bodies_joined 

而不是emails_bodies使用emails_bodies_joined在每一個地方,同一個表你需要你的加入表格爲