É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!