2016-05-16 2 views
1

Bit d'un utilisateur débutant, tentant de supprimer des lignes de deux tables. Je ne sais pas comment alias - ce qui semble être mon problème - toute aide sera utile!Erreur MySQL lors de la suppression avec la jointure interne (ID 1066 non-unique)

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" 

ne réussit pas avec:

1066: Not unique table/alias: 'emails_bodies' 

Répondre

1

Vous avez une référence supplémentaire à la table emails_bodies dans votre requête DELETE. Essayez ceci:

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

J'ai aussi retiré l'une des tables de la liste de sélection, car MySQL ne supprime pas de deux tables dans une requête. Une option pour que cela se produise serait de mettre en place une mise en cascade entre une table parente (par exemple emails) et une table enfant (par exemple emails_bodies). Puis la suppression d'un enregistrement dans emails supprimerait automatiquement les références de clé étrangère dans emails_bodies.

Quant à savoir pourquoi vous obtenez une erreur Not unique table/alias, MySQL interprété votre requête comme quelque chose le long des lignes de ce qui suit:

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" 

que vous utilisiez le même nom de table deux fois, sans donner chacun un alias unique.

+0

Bonne description. Votre solution supprimera-t-elle des lignes des deux tables ou simplement des "emails"? – David

+0

@David J'étais tellement pressé de poster que je n'ai même pas remarqué votre liste de sélection. Ne fais pas ça. Si vous avez vraiment besoin de supprimer des deux tables à la fois, essayez d'utiliser la suppression en cascade avec des clés étrangères. –

+0

Je l'ai, je vais juste exécuter deux requêtes de suppression, car je ne suis pas sûr de la façon de cascade. – David

0

Puisque vous joindre à la même table que vous devez utiliser as pour garder les noms de table uniques

INNER JOIN emails_bodies as emails_bodies_joined 

Et au lieu de emails_bodies utilisation emails_bodies_joined dans tous les lieux où votre besoin de votre table jointe à être