我在用户和角色之间建立了HABTM关联。
用户可以是角色的管理员(role_id = 1)或用户(role_id = 2)。
在join_users的连接表中,我有一些冗余记录。例如:
我想删除重复记录,例如1:1,2:4。
两个问题:
哪里是执行删除重复的sql脚本的最佳位置 - 迁移?脚本?
什么是删除重复的SQL查询?
答案 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
然后,您可以选择以下选项之一: