首頁 >資料庫 >mysql教程 >如何在沒有ROWID的MySQL中刪除重複行並新增複合主鍵?

如何在沒有ROWID的MySQL中刪除重複行並新增複合主鍵?

DDD
DDD原創
2024-12-07 06:35:12940瀏覽

How to Delete Duplicate Rows and Add a Composite Primary Key in MySQL Without ROWID?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn