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