Alternative au ROWID d'Oracle dans MySQL pour supprimer les valeurs en double et imposer une clé primaire composite
Le ROWID d'Oracle fournit un identifiant unique pour chaque ligne d'un tableau. Dans MySQL, il n'existe cependant pas d'équivalent exact à ROWID.
Pour la requête fournie :
delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)
qui vise à supprimer les lignes en double en fonction de colonnes spécifiques puis à imposer une clé primaire, il existe différentes approches dans MySQL.
Table temporaire et identifiant unique : une façon d'obtenir le résultat souhaité consiste à utiliser un tableau. Créez une table temporaire avec un identifiant de ligne unique (par exemple, some_row_uid) et insérez-y les données souhaitées. Ensuite, joignez la table d'origine à la table temporaire pour identifier et supprimer les lignes en double.
Variables de session : Alternativement, les variables de session peuvent être utilisées pour générer un décompte courant pour chaque ligne, efficacement créer un pseudo-ROWID. Cependant, cette approche peut rencontrer des limites lors de la manipulation de la même table dans des sous-requêtes.
Exemple de requête utilisant une table temporaire (syntaxe MySQL 8) :
CREATE TEMPORARY TABLE duplicates AS 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 my_table t, (SELECT @rowid:=NULL, @f1:=NULL, @f2:=NULL) as init ORDER BY field1, field2 DESC; DELETE my_table FROM my_table INNER JOIN duplicates ON my_table.some_row_uid = duplicates.some_row_uid WHERE duplicates.rowid > 0; ALTER TABLE my_table ADD PRIMARY KEY (field1, field2);
Cette approche peut introduire une surcharge due à la création et à la manipulation de la table temporaire. Pour les opérations ponctuelles, cela devrait apporter une solution raisonnable.
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!