Copier des lignes entre des tables en ignorant les doublons
Lorsque vous travaillez avec plusieurs tables, il est souvent nécessaire de copier des lignes entre elles. Cependant, il est crucial d'empêcher l'insertion de lignes en double. La discussion suivante aborde le problème d'un utilisateur lié à la mise en œuvre de cette tâche.
Initialement, l'utilisateur a tenté d'utiliser une clause WHERE avec une sous-requête pour identifier les lignes non en double. Cependant, cette approche n’a donné aucun résultat. Le remplacement de la clause WHERE par un filtrage par clé secondaire a également été envisagé, mais cela s'est avéré irréalisable étant donné la présence de plusieurs clés.
Une solution viable consiste à modifier la sous-requête pour inclure un prédicat qui identifie les lignes en double en fonction de critères spécifiques. Cela garantit que seules des lignes uniques sont insérées.
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.) )
Alternativement, une jointure externe peut être utilisée pour une plus grande concision :
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
Ces approches résolvent le problème des lignes en double dans la destination. tableau. Si toutefois le problème concerne les lignes en double dans la table source, la requête suivante peut être utilisée :
INSERT INTO destTable SELECT Distinct field1,field2,field3,... FROM srcTable
Enfin, il est recommandé de lister explicitement les champs dans l'instruction INSERT plutôt que de s'appuyer sur le * caractère générique pour garantir l’intégrité des données.
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!