删除连接表中的重复记录

ker*_*lin 4 mysql ruby-on-rails duplicate-removal has-and-belongs-to-many

我在用户和角色之间有一个HABTM关联.

用户可以是角色的admin(role_id = 1)或用户(role_id = 2).

在连接表,roles_users中,我有一些冗余记录.例如:

在此输入图像描述

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

两个问题:

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

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

Joh*_*hat 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;
Run Code Online (Sandbox Code Playgroud)

并为将来防止重复行

ALTER TABLE roles_users ADD UNIQUE INDEX (role_id, user_id);
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过以下步骤一步完成所有操作ALTER TABLE IGNORE:

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

IGNORE是标准SQL的MySQL扩展.如果新表中的唯一键上存在重复项,或者启用了严格模式时出现警告,它将控制ALTER TABLE的工作方式.如果未指定IGNORE,则复制将中止并在发生重复键错误时回滚.如果指定了IGNORE,则只使用第一行在唯一键上具有重复项的行.其他冲突的行将被删除.不正确的值将截断为最接近的匹配可接受值.