Trouver et supprimer les doublons de lignes par deux colonnes
J'ai lu tous les dupliqué questions/réponses et j'ai trouvé ceci pour être les plus pertinents de la réponse:
INSERT IGNORE INTO temp(MAILING_ID,REPORT_ID)
SELECT DISTINCT MAILING_ID,REPORT_IDFROM table_1
;
Le problème est que je veux supprimer les doublons par col1 et col2, mais également inclure les insérer tous les autres domaines de la table_1.
J'ai essayé d'ajouter toutes les colonnes de cette façon:
INSERT IGNORE INTO temp(M_ID,MAILING_ID,REPORT_ID,
MAILING_NAME,VISIBILITY,EXPORTED) SELECT DISTINCT
M_ID,MAILING_ID,REPORT_ID,MAILING_NAME,VISIBILITY,
EXPORTED FROM table_1
;
M_ID(int,primary),MAILING_ID(int),REPORT_ID(int),
MAILING_NAME(varchar),VISIBILITY(varchar),EXPORTED(int)
Mais il inséré toutes les lignes en temp (y compris les doublons)
- Eh bien pour une chose, ne pas utiliser de
INSERT IGNORE
dans votre cas, 2 --> Comment est votre db table? - pouvez-vous donner des exemples d'enregistrements?
- mise à jour de ma question avec les noms de champs et les types de
Vous devez vous connecter pour publier un commentaire.
La meilleure façon de supprimer les doublons sur plusieurs colonnes est la plus simple:
Ajouter un index UNIQUE:
L'IGNORER ci-dessus permet de s'assurer que seul le premier trouvé ligne est conservée, le reste rejeté.
(Vous pourrez ensuite déposer l'indice si vous avez besoin d'avenir des doublons et/ou de savoir qu'ils ne se reproduira pas).
set old_alter_table=1
voir docs sur: dev.mysql.com/doc/refman/5.5/en/alter-table.html en Raison d'un bug lié à la Rapide Création de l'Index (Bogue #40344), ALTER IGNORER TABLE ... AJOUTER un INDEX UNIQUE ne permet pas de supprimer les lignes en double. L'IGNORER le mot clé est ignoré. Si tous les doublons de lignes existent, l'opération échoue avec une entrée Double erreur. Une solution de contournement consiste à définir old_alter_table=1 avant de lancer un ALTER IGNORER TABLE ... AJOUTER un INDEX UNIQUE déclaration.ALTER IGNORE TABLE mytable ADD UNIQUE (FROM_UNIXTIME(CEIL(UNIX_TIMESTAMP(timestamp) / 5) * 5), id2)
Cela fonctionne parfaitement dans n'importe quelle version de MySQL y compris 5.7+. Il gère aussi l'erreur
You can't specify target table 'my_table' for update in FROM clause
à l'aide d'un double-sous-requête imbriquée. Il ne fait que supprimer UNE ligne en double (au plus tard) donc si vous avez 3 ou plus de doublons, vous pouvez exécuter la requête plusieurs fois. Il jamais supprime les lignes uniques.J'avais besoin de cette requête parce que je voulais ajouter un index UNIQUE sur deux colonnes, mais il y avait quelques lignes en double que j'avais besoin de jeter la première.
You can't specify target table 'table' for update in FROM clause
WHERE
clause utilise double de nidification. C'est la magie que des astuces de la base de données MySQL moteur en permettant à cette requête sans créer de conflit.Vous devez d'abord trouver votre duplicata par le groupement sur les deux champs avec une clause having.
Si cela renvoie ce que vous voulez, vous pouvez ensuite l'utiliser comme une sous-requête et
REMARQUE: Cette solution est une alternative & old school solution.
Si vous ne pouvait pas obtenir ce que tu voulais, alors vous pouvez essayer de mon "oldschool" méthode:
Tout d'abord, exécutez cette requête pour obtenir les enregistrements en double:
Après cela, sélectionnez-les résultats et de les coller dans notepad++:
Maintenant à l'aide de la rechercher et remplacer spécialité de notepad++ remplacer avec; première "supprimer", puis sur "insérer" des requêtes comme ceci (à partir de maintenant, pour des raisons de sécurité, mes valeurs seront AAAA).
Note spéciale: Veuillez effectuer une autre nouvelle ligne pour la fin de la dernière ligne de vos données à l'intérieur de notepad++ car regex correspondait à l' '\r\n' à la fin de chaque ligne:
Trouver ce regex:
\D*(\d+)\D*(\d+)\D*\r\n
Remplacer avec de la ficelle:
delete from table where column1 = $1 and column2 = $2; insert into table set column1 = $1, column2 = $2;\r\n
Enfin, maintenant, collez ces requêtes à MySQL Workbench, de la requête de la console et de les exécuter. Vous verrez qu'une occurrences de chaque enregistrement en double.
Cette réponse, c'est pour une table de relation construite de deux colonnes sans IDENTIFIANT. Je pense que vous pouvez appliquer à votre situation.
vous pouvez toujours obtenir la primaire ids par le regroupement de deux champs uniques
select count(*), id as count from table group by col a, col b having count(*)>1;
et puis
delete from table where id in ( select count(*), id as count from table group by col a, col b having count(*)>1) limit maxlimit;
vous pouvez également utiliser
max()
en place delimit
Pour Mysql:
SUPPRIMER t1 DE yourtable t1 INNER JOIN yourtable t2 where t1.id < t2.id ET t1.identField1= t2.identField1 et t1.identField2= t2.identField2;