2010-08-03 4 views
2

Comment puis-je supprimer des lignes dupliquées d'une table MySQL lorsqu'une relation de clé étrangère a déjà été configurée sur ces lignes.
Les doublons peuvent-ils être fusionnés d'une certaine manière, puis la clé étrangère mise à jour avec la nouvelle valeur?Supprimer les lignes dupliquées dans la table MySQL mais la relation de clé étrangère existe?

+0

Voulez-vous dire: les lignes qui sont des doublons * sauf * pour la clé primaire? – egrunin

+0

Oui, sauf la clé primaire et une autre colonne que je vais supprimer de la table. – chustar

Répondre

2

Si la clé étrangère est ON DELETE CASCADE, puis en supprimant les lignes en double également supprimer les lignes dépendantes, par exemple, si vous avez une table customers et une table orders, et une clé étrangère comme ALTER TABLE orders ADD FOREIGN KEY customer_id REFERENCES customers (id) ON DELETE CASCADE, puis en supprimant un client supprimera également les commandes de ce client. De même, si la clé étrangère a ON DELETE SET NULL, les commandes ne seront pas supprimées, mais leurs valeurs customer_id seront définies sur NULL. Si aucun de ces comportements n'est souhaité, créez une requête résolvant les conflits de clé étrangère en modifiant les colonnes de clé étrangère afin qu'elles référencent la ligne que vous souhaitez conserver (par exemple, mettre à jour toutes les commandes pour référencer les clients non dupliqués).), puis supprimez les lignes incriminées. Une autre alternative consiste à désactiver temporairement les contrôles de clé étrangère, mais cela vous laissera une base de données incohérente, donc je ne le recommanderais pas.

+0

Pourrais-je utiliser ON DELETE SET NULL pour définir toutes les colonnes de clé étrangère qui ont été liées à des doublons à NULL, puis les mettre à jour dans un script à l'ID directement au-dessus? – chustar

+1

"directement au-dessus" n'est pas exactement une construction SQL valide. Un enregistrement dans une base de données SQL n'a aucune connaissance de ce qui précède ou vient après dans la table de données. "before" et "after" sont imposés par l'opérateur (pensez-y comme la différence entre 'sort asc' et' sort desc'). –

+1

Vous pouvez utiliser une table temporaire pour stocker la relation entre les lignes que vous allez supprimer et la ligne correspondante que vous souhaitez conserver, par ex. 'CREATE TABLE client_duplicates (duplicate_id, original_id);' avec des FK pour les clients en double et originaux. Décidez quels clients vous souhaitez conserver et quels sont les doublons, remplissez le tableau des doublons en conséquence. Ensuite, mettez à jour la table des commandes afin que chaque commande référençant un client en double référence maintenant le client d'origine. Enfin, supprimez les clients en double et supprimez la table des doublons. – tdammers

Questions connexes