MySQL 中Oracle ROWID 的替代方案,用於刪除重複值和施加複合主鍵
Oracle 的ROWID 為表中的每一行提供唯一識別符桌子。然而,在 MySQL 中,沒有與 ROWID 完全相同的物件。
對於提供的查詢:
delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)
其目的是根據特定列刪除重複行,然後強加主鍵, MySQL 中有不同的方法。
臨時表和唯一識別碼:實現所需結果的一種方法是透過使用臨時表。建立一個具有唯一行標識符(例如,some_row_uid)的臨時表,並將所需的資料插入其中。然後,將原始表與臨時表連接起來,以識別並刪除重複的行。
會話變數:或者,會話變數可用於有效地為每行產生運行計數建立偽 ROWID。然而,在子查詢中操作同一個表時,這種方法可能會遇到限制。
使用臨時表的範例查詢(MySQL 8 語法):
CREATE TEMPORARY TABLE duplicates AS 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 my_table t, (SELECT @rowid:=NULL, @f1:=NULL, @f2:=NULL) as init ORDER BY field1, field2 DESC; DELETE my_table FROM my_table INNER JOIN duplicates ON my_table.some_row_uid = duplicates.some_row_uid WHERE duplicates.rowid > 0; ALTER TABLE my_table ADD PRIMARY KEY (field1, field2);
這種方法可能會因為建立和操作臨時表而引入一些開銷。對於一次性操作,應該提供合理的解決方案。
以上是如何在沒有ROWID的MySQL中刪除重複行並新增複合主鍵?的詳細內容。更多資訊請關注PHP中文網其他相關文章!