4

我有用戶和角色之間的HABTM關聯。刪除連接表中的重複記錄

對於角色,用戶可以是admin(role_id = 1)或user(role_id = 2)。

在連接表roles_users中,我有一些冗餘記錄。對於前:

enter image description here

我想刪除重複的記錄,如1:1,2:4。

兩個問題:

  1. 在哪裏執行sql腳本,去除複本最好的地方 - 遷移?腳本?

  2. 什麼是刪除dups sql查詢?

回答

12
CREATE TABLE roles_users2 LIKE roles_users; -- this ensures indexes are preserved 
INSERT INTO roles_users2 SELECT DISTINCT * FROM roles_users; 
DROP TABLE roles_users; 
RENAME TABLE roles_users2 TO roles_users; 

和未來,以防止重複行

ALTER TABLE roles_users ADD UNIQUE INDEX (role_id, user_id); 

或者,你可以用ALTER TABLE IGNORE做到這一切在一個步:

ALTER IGNORE TABLE roles_users ADD UNIQUE INDEX (role_id, user_id);

IGNORE是標準SQL的MySQL擴展。它控制着ALTER TABLE如何在新表中的唯一鍵上存在重複或如果啓用嚴格模式時發生警告。如果未指定IGNORE,則複製將被中止並在發生重複鍵錯誤時回退。如果指定IGNORE,則只有第一行用於具有唯一鍵上的重複項的行。其他衝突的行被刪除。不正確的值將被截斷爲最接近的匹配可接受值。

+0

+1使用LIKE的好主意。 – 2011-02-13 23:09:22

3

最簡單的是將數據複製到新表,減去重複的:

CREATE TABLE roles_users2 AS 
SELECT DISTINCT * FROM roles_users 

然後,您可以選擇以下之一:

  • 刪除舊錶,將新表重命名爲舊名稱並添加索引。
  • 截斷舊錶並將來自roles_users2的行插回到roles_users。
+0

截斷舊錶將保持約束和外鍵引用不動。當然,如果它首先有明顯的限制,那麼就不會有重複。 (聳肩) – 2011-02-13 22:45:24