Équivalent de RowID d'Oracle MySQL
Question
est-il un équivalent de rowid Oracle dans une base MySQL?
delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)
Je veux faire un équivalent mysql de cette requête !!!
Ce que je suis en train de faire est,: Le my_table n'a pas de clé primaire .. Je suis en train de supprimer les valeurs en double et imposer une clé primaire (composite champ1, champ2) .. !!
La solution
Dans MySql vous habituellement des variables de session d'utilisation pour ACHIVE la fonctionnalité:
SELECT @rowid:=@rowid+1 as rowid
FROM table1, (SELECT @rowid:=0) as init
ORDER BY sorter_field
Mais vous ne pouvez pas sortes sur la table que vous essayez de supprimer dans les sous-requêtes.
UPD : qui vous devrez créer une table temporaire, insérer la sous-requête allant à la table temporaire et supprimer de la table d'origine en se joignant à la table temporaire (vous aurez besoin d'une ligne unique identifiant):
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
Puisque c'est une opération de temps, cela ne devrait pas apporter trop de frais généraux.
Autres conseils
Peut-être, je suis interprète mal la question, mais votre requête (même dans Oracle) ne réalise pas votre objectif souhaité:
delete from my_table where rowid not in (select max(rowid) from
my_table group by field1,field2)
équivalent MySQL est
SELECT @rowid:=max(rowid) from my_table;
DELETE FROP my_table where rowid != @rowid;
effacera toutes les lignes sauf pour dernier.
Pour effectuer un nettoyage de temps (supprimer les doublons) de vos données, vous pouvez faire ceci:
CREATE TABLE my_table2 SELECT distinct f1, f2, f3, etc from my_table;
DROP TABLE my_table;
ALTER TABLE my_table2 RENAME my_table;
Ensuite, ajoutez des colonnes et quelle que soit les clés nécessaires par ALTER TABLE. Au-dessus de code peut obliger à déposer les clés étrangères que vous pourriez avoir.
vous pouvez éviter la table temporaire en utilisant une autre table dérivée:
DELETE FROM my_table USING my_table JOIN (
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) as duplicates
ON my_table.some_row_uid = duplicates.some_row_uid AND duplicates.rowid > 0
mysql> set @row_num = 0;
Tout d'abord réglé rowId ou à la ligne num l'utilisation comme suit:
mysql> SELECT @row_num := @row_num + 1 as row_number,id,name,salary FROM employee
ORDER BY salary;