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
Linda Hamiltonoriginal
2024-12-09 20:20:15530parcourir

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)

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

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

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!

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