J'ai une table avec les champs suivants:
id (Unique)
url (Unique)
title
company
site_id
Maintenant, je dois supprimer des lignes ayant le même title, company and site_id
. Une façon de le faire sera d'utiliser le SQL suivant avec un script ( PHP
):
SELECT title, site_id, location, id, count( * )
FROM jobs
GROUP BY site_id, company, title, location
HAVING count( * ) >1
Après avoir exécuté cette requête, je peux supprimer les doublons à l'aide d'un script côté serveur.
Mais, je veux savoir si cela ne peut être fait qu'en utilisant une requête SQL.
mysql
sql
duplicates
Chétan
la source
la source
Réponses:
Un moyen très simple de le faire est d'ajouter un
UNIQUE
index sur les 3 colonnes. Lorsque vous écrivez laALTER
déclaration, incluez leIGNORE
mot - clé. Ainsi:Cela supprimera toutes les lignes en double. Comme avantage supplémentaire, les futurs
INSERTs
doublons seront des erreurs. Comme toujours, vous voudrez peut-être faire une sauvegarde avant d'exécuter quelque chose comme ça ...la source
set session old_alter_table=1;
Si vous ne souhaitez pas modifier les propriétés de la colonne, vous pouvez utiliser la requête ci-dessous.
Étant donné que vous avez une colonne qui a des ID uniques (par exemple, des
auto_increment
colonnes), vous pouvez l'utiliser pour supprimer les doublons:Dans MySQL, vous pouvez le simplifier encore plus avec l' opérateur égal NULL-safe (alias "opérateur de vaisseau spatial" ):
la source
MySQL a des restrictions sur la référence à la table que vous supprimez. Vous pouvez contourner cela avec une table temporaire, comme:
D'après la suggestion de Kostanos dans les commentaires:
La seule requête lente ci-dessus est DELETE, pour les cas où vous avez une très grande base de données. Cette requête pourrait être plus rapide:
la source
DELETE FROM YourTable USING YourTable, tmpTable WHERE YourTable.id=tmpTable.id
DELETE
, mais aussiINSERT
à la table temporaire, cela m'a pris beaucoup de temps. Un index pour la table tmp pourrait donc aider beaucoupcreate index tmpTable_id_index on tmpTable (id)
, du moins pour moi.create temporary table tmpTable (id int, PRIMARY KEY (id));
Si l'
IGNORE
instruction ne fonctionne pas comme dans mon cas, vous pouvez utiliser l'instruction ci-dessous:la source
La suppression des doublons sur les tables MySQL est un problème courant, c'est généralement le résultat d'une contrainte manquante pour éviter ces doublons à l'avance. Mais ce problème commun s'accompagne généralement de besoins spécifiques ... qui nécessitent des approches spécifiques. L'approche doit être différente selon, par exemple, la taille des données, l'entrée dupliquée qui doit être conservée (généralement la première ou la dernière), s'il y a des index à conserver ou si nous voulons effectuer des action sur les données dupliquées.
Il existe également certaines spécificités sur MySQL lui-même, comme le fait de ne pas pouvoir référencer la même table sur une cause FROM lors de l'exécution d'une mise à jour de table (cela soulèvera l'erreur MySQL # 1093). Cette limitation peut être surmontée en utilisant une requête interne avec une table temporaire (comme suggéré dans certaines approches ci-dessus). Mais cette requête interne ne fonctionnera pas particulièrement bien lorsqu'il s'agit de sources de données volumineuses.
Cependant, il existe une meilleure approche pour supprimer les doublons, à la fois efficace et fiable, et qui peut être facilement adaptée à différents besoins.
L'idée générale est de créer une nouvelle table temporaire, en ajoutant généralement une contrainte unique pour éviter d'autres doublons, et d'insérer les données de votre ancienne table dans la nouvelle, tout en prenant soin des doublons. Cette approche repose sur des requêtes MySQL INSERT simples, crée une nouvelle contrainte pour éviter d'autres doublons, et ignore la nécessité d'utiliser une requête interne pour rechercher des doublons et une table temporaire qui doit être conservée en mémoire (s'adaptant ainsi également aux sources de Big Data).
Voilà comment cela peut être réalisé. Étant donné que nous avons un employé de table , avec les colonnes suivantes:
Afin de supprimer les lignes avec une colonne ssn en double et en ne conservant que la première entrée trouvée, le processus suivant peut être suivi:
Explication technique
⇒ En utilisant cette approche, 1,6M de registres ont été convertis en 6k en moins de 200s.
Chetan , en suivant ce processus, vous pouvez supprimer rapidement et facilement tous vos doublons et créer une contrainte UNIQUE en exécutant:
Bien sûr, ce processus peut être modifié pour l'adapter aux différents besoins lors de la suppression des doublons. Quelques exemples suivent.
✔ Variation pour conserver la dernière entrée au lieu de la première
Parfois, nous devons conserver la dernière entrée dupliquée au lieu de la première.
✔ Variation pour effectuer certaines tâches sur les doublons, par exemple en comptant les doublons trouvés
Parfois, nous devons effectuer un traitement supplémentaire sur les entrées dupliquées trouvées (par exemple, en comptant les doublons).
✔ Variation pour régénérer l'identifiant de champ auto-incrémental
Parfois, nous utilisons un champ auto-incrémentiel et, afin de garder l'index aussi compact que possible, nous pouvons profiter de la suppression des doublons pour régénérer le champ auto-incrémental dans la nouvelle table temporaire.
✔ Autres variations
De nombreuses autres modifications sont également réalisables en fonction du comportement souhaité. À titre d'exemple, les requêtes suivantes utiliseront une deuxième table temporaire pour, outre 1) conserver la dernière entrée au lieu de la première; et 2) augmenter le compteur des doublons trouvés; également 3) régénérer l'identifiant de champ auto-incrémentiel tout en conservant l'ordre d'entrée tel qu'il était sur les anciennes données.
la source
Il existe une autre solution:
la source
si vous avez une grande table avec un grand nombre d'enregistrements, les solutions ci-dessus ne fonctionneront pas ou ne prendront pas trop de temps. Ensuite, nous avons une solution différente
la source
J'ai ce snipet de requête pour SQLServer mais je pense qu'il peut être utilisé dans d'autres SGBD avec peu de changements:
J'ai oublié de vous dire que cette requête ne supprime pas la ligne avec l'ID le plus bas des lignes dupliquées. Si cela fonctionne pour vous, essayez cette requête:
la source
ERROR 1093: You can't specify target table 'Table' for update in FROM clause
"You can't specify target table 'Table' for update in FROM..."
erreur, utilisez:DELETE FROM Table WHERE Table.idTable IN ( SELECT MAX(idTable) FROM (SELECT * FROM idTable) AS tmp GROUP BY field1, field2, field3 HAVING COUNT(*) > 1)
qui force MySQL à créer une table temporellement. Cependant, il est très lent dans les grands ensembles de données ... dans de tels cas, je recommanderai le code d'Andomar, qui est beaucoup plus rapide.Le moyen le plus rapide consiste à insérer des lignes distinctes dans une table temporaire. En utilisant la suppression, il m'a fallu quelques heures pour supprimer les doublons d'une table de 8 millions de lignes. En utilisant insert et distinct, cela n'a pris que 13 minutes.
la source
TRUNCATE TABLE tableName
et 5e ligne devrait direINSERT INTO tableName SELECT * FROM tempTableName;
Une solution simple à comprendre et qui fonctionne sans clé primaire:
1) ajouter une nouvelle colonne booléenne
2) ajouter une contrainte sur les colonnes dupliquées ET la nouvelle colonne
3) définissez la colonne booléenne sur true. Cela ne réussira que sur l'une des lignes dupliquées en raison de la nouvelle contrainte
4) supprimer les lignes qui n'ont pas été marquées comme étant conservées
5) déposez la colonne ajoutée
Je vous suggère de conserver la contrainte que vous avez ajoutée, afin d'éviter de nouveaux doublons à l'avenir.
la source
Supprimer les lignes en double à l'aide de l'instruction DELETE JOIN MySQL vous fournit l'instruction DELETE JOIN que vous pouvez utiliser pour supprimer rapidement les lignes en double.
L'instruction suivante supprime les lignes en double et conserve l'ID le plus élevé:
la source
J'ai trouvé un moyen simple. (garder le dernier)
la source
Simple et rapide pour tous les cas:
la source
Cela supprimera les lignes en double avec les mêmes valeurs pour le titre, la société et le site. La première occurrence sera conservée et tous les doublons seront supprimés
la source
Je continue à visiter cette page chaque fois que je google "supprime les doublons de mysql" mais pour mes solutions theIGNORE ne fonctionnent pas car j'ai des tables mysql InnoDB
ce code fonctionne mieux à tout moment
tableToclean = le nom de la table que vous devez nettoyer
tableToclean_temp = une table temporaire créée et supprimée
la source
Cette solution déplacera les doublons dans une table et les uniques dans une autre .
la source
SELECT * FROM jobs GROUP BY site_id, company, title, location
?Depuis la version 8.0 (2018), MySQL prend enfin en charge les fonctions de fenêtre .
Les fonctions des fenêtres sont à la fois pratiques et efficaces. Voici une solution qui montre comment les utiliser pour résoudre cette tâche.
Dans une sous-requête, nous pouvons utiliser
ROW_NUMBER()
pour attribuer une position à chaque enregistrement de la table dans descolumn1/column2
groupes, classés parid
. S'il n'y a pas de doublons, l'enregistrement obtiendra le numéro de ligne1
. S'il existe des doublons, ils seront numérotés par ordre croissantid
(à partir de1
).Une fois les enregistrements correctement numérotés dans la sous-requête, la requête externe supprime simplement tous les enregistrements dont le numéro de ligne n'est pas 1.
Requete :
la source
Pour supprimer l'enregistrement en double dans une table.
ou
la source
la source
Afin de dupliquer des enregistrements avec des colonnes uniques, par exemple COL1, COL2, COL3 ne doivent pas être répliqués (supposons que nous ayons omis 3 colonnes uniques dans la structure du tableau et que plusieurs entrées en double aient été introduites dans le tableau)
L'espoir aidera le dev.
la source
TL; TR;
Un tutoriel largement décrit pour résoudre ce problème peut être trouvé sur le site mysqltutorial.org :
Comment supprimer des lignes en double dans MySQL
Il est très clairement montré comment supprimer les lignes en double de trois manières différentes :
A) Utilisation de l'
DELETE JOIN
instructionB) Utilisation d'une table intermédiaire
C) Utilisation de la
ROW_NUMBER()
fonctionJ'espère que cela aidera quelqu'un.
la source
J'ai une table qui oublie d'ajouter une clé primaire dans la ligne id. Bien qu'il ait auto_increment sur l'id. Mais un jour, une chose rejoue le journal bin mysql sur la base de données qui insère des lignes en double.
Je supprime la ligne en double par
select T1.* from table_name T1 inner join (select count(*) as c,id from table_name group by id) T2 on T1.id = T2.id where T2.c > 1 group by T1.id;
supprimer les lignes en double par id
insérez la ligne à partir des données exportées.
Ajoutez ensuite la clé primaire sur id
la source
J'aime être un peu plus précis sur les enregistrements que je supprime alors voici ma solution:
la source
Vous pouvez facilement supprimer les enregistrements en double de ce code.
la source
J'ai dû le faire avec des champs de texte et suis tombé sur la limite de 100 octets sur l'index.
J'ai résolu cela en ajoutant une colonne, en faisant un hachage md5 des champs et en faisant l'alter.
la source