MySQL-Äquivalent der RowID von Oracle
In Oracle identifiziert die ROWID-Spalte jede Zeile in einer Tabelle eindeutig. Gibt es eine äquivalente Spalte in MySQL?
Die Frage stellt sich häufig, wenn Vorgänge wie das Löschen doppelter Datensätze bei gleichzeitiger Festlegung eines Primärschlüssels ausgeführt werden, wie in der bereitgestellten Abfrage:
delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)
MySQL-Lösung
Im Gegensatz zu Oracle hat MySQL kein direktes Äquivalent zu ROWID. Stattdessen können Sie Sitzungsvariablen verwenden, um eine eindeutige Zeilenkennung zu generieren:
SELECT @rowid:=@rowid+1 as rowid FROM table1, (SELECT @rowid:=0) as init ORDER BY sorter_field
Dieser Ansatz kann jedoch nicht in Unterabfragen verwendet werden, die nach der Zieltabelle sortieren, aus der gelöscht wird.
Alternativer Ansatz
Um doppelte Datensätze zu löschen und einen Primärschlüssel zu erzwingen, können Sie eine temporäre Tabelle erstellen, um die eindeutige Zeile zu speichern Bezeichner:
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
Dieser Ansatz erstellt eine temporäre Tabelle, fügt die eindeutigen Zeilenbezeichner ein und verwendet dann einen Join, um doppelte Datensätze aus der Originaltabelle zu löschen. Obwohl dadurch ein geringer Mehraufwand entsteht, ist es eine praktikable Lösung für einmalige Vorgänge.
Das obige ist der detaillierte Inhalt vonVerfügt MySQL über ein ROWID-Äquivalent zum Löschen doppelter Datensätze?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!