Maison >base de données >tutoriel mysql >Comment copier des lignes entre des tables sans créer de doublons ?

Comment copier des lignes entre des tables sans créer de doublons ?

DDD
DDDoriginal
2024-12-27 05:14:13660parcourir

How to Copy Rows Between Tables Without Creating Duplicates?

Copier des lignes entre des tables sans dupliquer les données

Lors du transfert de données d'une table à une autre, il est crucial d'éviter l'insertion de lignes en double. Pour y parvenir, nous avons besoin d'une méthode qui filtre les enregistrements existants.

Dans votre approche initiale, vous avez tenté d'utiliser une clause WHERE avec une sous-requête pour identifier des lignes uniques. Cependant, la sous-requête manquait de critères pour déterminer les doublons.

Solution utilisant une sous-requête avec le filtrage WHERE

Pour filtrer efficacement les doublons, vous pouvez modifier votre sous-requête comme suit :

INSERT INTO destTable
SELECT Field1,Field2,Field3,... 
FROM srcTable
WHERE NOT EXISTS(SELECT * 
                 FROM destTable 
                 WHERE (srcTable.Field1=destTable.Field1 and
                       SrcTable.Field2=DestTable.Field2...etc.)
                 )

Cette sous-requête mise à jour ajoute une condition qui compare des champs spécifiques entre les tables source et de destination pour déterminer si un doublon existe.

Solution utilisant une jointure externe

Vous pouvez également utiliser une jointure externe pour obtenir le même résultat. Une jointure externe récupère toutes les lignes d'une table et les lignes correspondantes d'une autre table, laissant les lignes sans correspondance comme NULL.

INSERT INTO destTable
SELECT s.field1,s.field2,s.field3,... 
FROM srcTable s 
       LEFT JOIN destTable d ON (d.Key1 = s.Key1 AND d.Key2 = s.Key2 AND...)
WHERE d.Key1 IS NULL

Dans ce cas, la jointure externe fait correspondre les lignes en fonction de leurs champs clés (Key1, Key2, etc.). Les lignes de la table source qui ne correspondent à aucune ligne de la table de destination auront des valeurs NULL pour les champs clés, et ces lignes seront insérées dans la table de destination.

Considérations supplémentaires

Si vous souhaitez uniquement éviter les doublons à partir de la table source, vous pouvez utiliser un mot-clé distinct dans votre SELECT déclaration :

INSERT INTO destTable
SELECT Distinct field1,field2,field3,... 
FROM srcTable  

Enfin, il est recommandé de spécifier les champs spécifiques dans votre instruction INSERT au lieu d'utiliser SELECT * pour des raisons de performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn