删除连接表中的重复记录

时间:2011-02-13 21:35:21

标签: mysql ruby-on-rails has-and-belongs-to-many duplicate-removal

我在用户和角色之间建立了HABTM关联。

用户可以是角色的管理员(role_id = 1)或用户(role_id = 2)。

在join_users的连接表中,我有一些冗余记录。例如:

enter image description here

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

两个问题:

  1. 哪里是执行删除重复的sql脚本的最佳位置 - 迁移?脚本?

  2. 什么是删除重复的SQL查询?

2 个答案:

答案 0 :(得分: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,则只使用第一行在唯一键上具有重复项的行。其他冲突的行将被删除。不正确的值将被截断为最接近的匹配可接受值。

答案 1 :(得分:3)

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

CREATE TABLE roles_users2 AS
SELECT DISTINCT * FROM roles_users

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

  • 删除旧表,将新表重命名为旧名称并添加索引。
  • 截断旧表并将roles_users2中的行重新插入roles_users。