4

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

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

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

在此处输入图像描述

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

两个问题:

  1. 执行删除 dups 的 sql 脚本的最佳位置在哪里——迁移?脚本?

  2. 删除 dups 的 sql 查询是什么?

4

2 回答 2

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

于 2011-02-13T21:42:26.280 回答
3

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

CREATE TABLE roles_users2 AS
SELECT DISTINCT * FROM roles_users

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

  • 删除旧表,将新表重命名为旧名称并添加索引。
  • 截断旧表并将roles_users2 中的行插入回roles_users。
于 2011-02-13T21:37:51.527 回答