Maison > base de données > tutoriel mysql > Comment supprimer les lignes en double et ajouter une clé primaire composite dans MySQL sans ROWID ?

Comment supprimer les lignes en double et ajouter une clé primaire composite dans MySQL sans ROWID ?

DDD
Libérer: 2024-12-07 06:35:12
original
918 Les gens l'ont consulté

How to Delete Duplicate Rows and Add a Composite Primary Key in MySQL Without ROWID?

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)
Copier après la connexion

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);
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal