web-dev-qa-db-fra.com

Équivalent du RowID d’Oracle dans MySQL

y a-t-il un équivalent de rowid d'Oracle dans 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 j'essaie de faire est: La table_mis n'a pas de clé primaire. J'essaie de supprimer les valeurs en double et d'imposer une clé primaire (composé de champ1, champ2) .. !!

20
raj

Dans MySql, vous utilisez généralement des variables de session pour obtenir les fonctionnalités suivantes:

SELECT @rowid:=@rowid+1 as rowid
FROM table1, (SELECT @rowid:=0) as init
ORDER BY sorter_field

Mais vous ne pouvez pas effectuer de tris sur la table que vous essayez de supprimer des sous-requêtes.

UPD: vous devrez créer une table temporaire, insérer la sous-requête de télémétrie dans la table temporaire et la supprimer de la table d'origine en la joignant à la table temporaire (vous aurez besoin d'un identifiant de ligne unique):

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

Comme il s’agit d’une opération ponctuelle, cela ne devrait pas entraîner trop de frais généraux.

24
newtover

Peut-être que je suis en train de mal interpréter la question mais que votre requête (même dans Oracle) n'atteint pas votre objectif souhaité:

delete from my_table where rowid not in (select max(rowid) from 
my_table group by field1,field2)

L'équivalent MySQL est

SELECT @rowid:=max(rowid) from my_table;
DELETE FROP my_table where rowid != @rowid;

Cela effacera toutes les lignes sauf la dernière.

Pour effectuer un nettoyage ponctuel (en supprimant les enregistrements en double) de vos données, procédez comme suit:

CREATE TABLE my_table2 SELECT distinct f1, f2, f3, etc from my_table;
DROP TABLE my_table;
ALTER TABLE my_table2 RENAME my_table;

Ajoutez ensuite les colonnes et les clés nécessaires avec ALTER TABLE. Le code ci-dessus peut nécessiter de supprimer toutes les clés étrangères que vous pourriez avoir.

1
Alexey Gerasimov
mysql> set @row_num = 0;

Commencez par définir rowId ou row num, utilisez-le comme suit: 

mysql>  SELECT @row_num := @row_num + 1 as row_number,id,name,salary FROM employee
ORDER BY salary;
0
Mukesh Kumar

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
0
mosheb