删除连接表中的重复记录
我有用户和角色之间的HABTM关联。删除连接表中的重复记录
对于角色,用户可以是admin(role_id = 1)或user(role_id = 2)。
在连接表roles_users中,我有一些冗余记录。对于前:
我想删除重复的记录,如1:1,2:4。
两个问题:
在哪里执行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
然后,您可以选择以下之一:
- 删除旧表,将新表重命名为旧名称并添加索引。
- 截断旧表并将来自roles_users2的行插回到roles_users。
截断旧表将保持约束和外键引用不动。当然,如果它首先有明显的限制,那么就不会有重复。 (耸肩) – 2011-02-13 22:45:24
+1使用LIKE的好主意。 – 2011-02-13 23:09:22