Maison >base de données >tutoriel mysql >Comment puis-je copier des lignes d'une table à une autre tout en évitant les doublons ?

Comment puis-je copier des lignes d'une table à une autre tout en évitant les doublons ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-28 03:06:09430parcourir

How Can I Copy Rows from One Table to Another While Preventing Duplicates?

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!

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