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!