Equivalente di RowID di Oracle in MySQL

c’è un equivalente del rowid di Oracle in mysql?

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

Voglio fare un equivalente mysql di questa query !!!

Quello che sto cercando di fare è,: my_table non ha la chiave primaria .. sto cercando di eliminare i valori duplicati e di imporre una chiave primaria (composito di field1, field2) .. !!

In MySql di solito usi le variabili di sessione per ottenere la funzionalità:

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

Ma non puoi fare il genere sulla tabella che stai cercando di cancellare da sottoquery.

UPD : è necessario creare una tabella temporanea, inserire la sottoquery che va nella tabella temporanea ed eliminare dalla tabella originale unendosi alla tabella temporanea (è necessario un identificatore di riga univoco):

 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 

Poiché si tratta di un’operazione singola, questo non dovrebbe comportare un sovraccarico eccessivo.

Forse sto fraintendendo la domanda ma la tua domanda (anche in Oracle) non raggiunge l’objective desiderato:

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

Equivalente a MySQL

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

Questo cancellerà tutte le righe tranne l’ultima.

Per eseguire una pulizia una volta (rimuovendo i record duplicati) dei tuoi dati puoi farlo:

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

Quindi aggiungere qualsiasi colonna e chiave necessaria da ALTER TABLE. Sopra il codice potrebbe essere necessario eliminare tutte le chiavi esterne che potresti avere.

puoi evitare la tabella temporanea usando un’altra tabella derivata:

 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; 

Per prima cosa imposta rowId o row num usalo come segue:

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