我有用戶和角色之間的HABTM關聯。刪除連接表中的重複記錄
對於角色,用戶可以是admin(role_id = 1)或user(role_id = 2)。
在連接表roles_users中,我有一些冗餘記錄。對於前:
我想刪除重複的記錄,如1:1,2:4。
兩個問題:
在哪裏執行sql腳本,去除複本最好的地方 - 遷移?腳本?
什麼是刪除dups sql查詢?
我有用戶和角色之間的HABTM關聯。刪除連接表中的重複記錄
對於角色,用戶可以是admin(role_id = 1)或user(role_id = 2)。
在連接表roles_users中,我有一些冗餘記錄。對於前:
我想刪除重複的記錄,如1:1,2:4。
兩個問題:
在哪裏執行sql腳本,去除複本最好的地方 - 遷移?腳本?
什麼是刪除dups sql查詢?
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,則只有第一行用於具有唯一鍵上的重複項的行。其他衝突的行被刪除。不正確的值將被截斷爲最接近的匹配可接受值。
最簡單的是將數據複製到新表,減去重複的:
CREATE TABLE roles_users2 AS
SELECT DISTINCT * FROM roles_users
然後,您可以選擇以下之一:
截斷舊錶將保持約束和外鍵引用不動。當然,如果它首先有明顯的限制,那麼就不會有重複。 (聳肩) – 2011-02-13 22:45:24
+1使用LIKE的好主意。 – 2011-02-13 23:09:22