Frage

ist es ein Äquivalent von Oracle Rowid in mysql?

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

Ich mag ein MySQL-Äquivalent dieser Abfrage machen !!!

Was ich versuche zu tun,: Die my_table keinen Primärschlüssel hat .. Ich versuche, die doppelten Werte zu löschen und einen Primärschlüssel (Verbund aus field1, field2) .. !!

zu verhängen
War es hilfreich?

Lösung

In MySql Sie in der Regel verwendet Session-Variablen, die Funktionalität achive:

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

Aber man kann nicht sortiert auf dem Tisch machen Sie in Subqueries zu löschen versuchen.

UPD : dass Sie wird benötigt eine temporäre Tabelle erstellen, geben Sie den Bereich Unterabfrage auf der temporären Tabelle und aus der ursprünglichen Tabelle löschen, indem Sie mit der temporären Tabelle verbinden (Sie werden einige einzigartige Reihe brauchen identifier):

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

Da dieses eine Mal Betrieb ist, sollte dies nicht zu viel Aufwand bringen.

Andere Tipps

Vielleicht, ich Verlesen die Frage aber Ihre Abfrage (auch in Oracle) nicht Ihr gewünschtes Ziel nicht erreichen:

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

MySQL entspricht

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

Damit werden alle Zeilen mit Ausnahme der letzten auszulöschen.

einmal Bereinigung durchzuführen (Entfernen von doppelten Datensatz) Ihre Daten, die Sie dies tun können:

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

Fügen Sie dann unabhängig von Spalten und Schlüssel notwendig durch ALTER TABLE. Oberhalb Code keine Fremdschlüssel fallen könnte erforderlich machen könnten Sie haben.

können Sie die temporäre Tabelle mit einer anderen abgeleiteten Tabelle vermeiden:

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;

Erster Satz rowID oder Zeile num die Verwendung es wie folgt:

mysql>  SELECT @row_num := @row_num + 1 as row_number,id,name,salary FROM employee
ORDER BY salary;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top