Copier des lignes dans une table en évitant les doublons
Le but est de transférer toutes les lignes d'une table (srcTable) à une autre (destTable) , à l'exclusion de toute entrée en double. Bien qu'il puisse sembler simple d'ajouter une clause WHERE avec une sous-requête qui filtre les doublons, cette approche peut échouer.
Problème de sous-requête :
La requête d'origine est la suivante :
INSERT INTO destTable SELECT * FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable)
Cependant, cette requête n'insère aucune ligne car la sous-requête renvoie toutes les lignes de destTable, que ce soit ils correspondent à toutes les lignes de srcTable. Pour que la sous-requête fonctionne, elle doit inclure une condition supplémentaire pour identifier les lignes en double en fonction des champs pertinents.
Sous-requête révisée :
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 révisée compare des champs pour déterminer les doublons et les exclut de l'insertion.
Jointure externe Alternative :
Une autre approche consiste à utiliser une jointure externe :
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
Cette technique de jointure externe filtre les lignes de srcTable qui ont des clés correspondantes dans destTable, en excluant les doublons lors de l'insertion. .
Adressage des doublons de la table source :
Si le Le problème est que sourceTable contient des lignes en double, la requête doit être modifiée pour sélectionner des lignes distinctes :
INSERT INTO destTable SELECT DISTINCT Field1, Field2, Field3,... FROM srcTable
Il est recommandé d'inclure des noms de champs spécifiques dans l'instruction INSERT plutôt que d'utiliser SELECT *.
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!