Maison > base de données > tutoriel mysql > MySQL a-t-il un équivalent ROWID pour supprimer les enregistrements en double ?

MySQL a-t-il un équivalent ROWID pour supprimer les enregistrements en double ?

Linda Hamilton
Libérer: 2024-12-09 20:20:15
original
525 Les gens l'ont consulté

Does MySQL Have a ROWID Equivalent for Deleting Duplicate Records?

Équivalent MySQL du RowID d'Oracle

Dans Oracle, la colonne ROWID identifie de manière unique chaque ligne d'une table. Existe-t-il une colonne équivalente dans MySQL ?

La question se pose souvent lors de la réalisation d'opérations telles que la suppression d'enregistrements en double tout en imposant une clé primaire, comme dans la requête fournie :

delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)
Copier après la connexion

Solution MySQL

Contrairement à Oracle, MySQL n'a pas d'équivalent direct à ROWID. Au lieu de cela, vous pouvez utiliser des variables de session pour générer un identifiant de ligne unique :

SELECT @rowid:=@rowid+1 as rowid
FROM table1, (SELECT @rowid:=0) as init
ORDER BY sorter_field
Copier après la connexion

Cependant, cette approche ne peut pas être utilisée dans les sous-requêtes qui effectuent un tri sur la table cible en cours de suppression.

Approche alternative

Pour supprimer les enregistrements en double et appliquer une clé primaire, vous pouvez créer une table temporaire pour stocker la ligne unique identifiants :

CREATE TEMPORARY TABLE duplicates ...

INSERT INTO duplicates (rowid, field1, field2, some_row_uid)
SELECT
  @rowid:=IF(@f1=field1 AND @f2=field2, @rowid+1, 0) as rowid,
  @f1:=field1 as field1,
  @f2:=field2 as field2,
  some_row_uid
FROM testruns t, (SELECT @rowid:=NULL, @f1:=NULL, @f2:=NULL) as init
ORDER BY field1, field2 DESC;

DELETE FROM my_table USING my_table JOIN duplicates
  ON my_table.some_row_uid = duplicates.some_row_uid AND duplicates.rowid > 0
Copier après la connexion

Cette approche crée une table temporaire, insère les identifiants de ligne uniques, puis utilise une jointure pour supprimer les enregistrements en double de la table d'origine. Bien que cela ajoute une surcharge mineure, il s'agit d'une solution viable pour les opérations ponctuelles.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal