删除连接表中的重复记录

问题描述:

我有用户和角色之间的HABTM关联。删除连接表中的重复记录

对于角色,用户可以是admin(role_id = 1)或user(role_id = 2)。

在连接表roles_users中,我有一些冗余记录。对于前:

enter image description here

我想删除重复的记录,如1:1,2:4。

两个问题:

  1. 在哪里执行sql脚本,去除复本最好的地方 - 迁移?脚本?

  2. 什么是删除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,则只有第一行用于具有唯一键上的重复项的行。其他冲突的行被删除。不正确的值将被截断为最接近的匹配可接受值。

+0

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

最简单的是将数据复制到新表,减去重复的:

CREATE TABLE roles_users2 AS 
SELECT DISTINCT * FROM roles_users 

然后,您可以选择以下之一:

  • 删除旧表,将新表重命名为旧名称并添加索引。
  • 截断旧表并将来自roles_users2的行插回到roles_users。
+0

截断旧表将保持约束和外键引用不动。当然,如果它首先有明显的限制,那么就不会有重复。 (耸肩) – 2011-02-13 22:45:24