我们有一个表business_users
,其中有一个user_id
和business_id
,我们有重复项。 我该如何编写一个查询来删除除一个以外的所有重复项?删除除一个以外的所有副本
3
A
回答
9
完全相同行
如果你想完全避免相同的行,我明白你的问题在第一,那么你可以选择唯一行到一个单独的表,并重新创建该表的数据。
CREATE TEMPORARY TABLE tmp SELECT DISTINCT * FROM business_users;
DELETE FROM business_users;
INSERT INTO business_users SELECT * FROM tmp;
DROP TABLE tmp;
要小心,如果有引用此表的任何外键约束,但是,作为行临时删除可能导致级联删除别处。
引入的唯一约束
如果你只关心对user_id
和business_id
,你可能想避免在未来引入重复。您可以将现有数据移动到临时表中,添加约束,然后将表格数据移回,忽略重复项。
CREATE TEMPORARY TABLE tmp SELECT * FROM business_users;
DELETE FROM business_users;
ALTER TABLE business_users ADD UNIQUE (user_id, business_id);
INSERT IGNORE INTO business_users SELECT * FROM tmp;
DROP TABLE tmp;
以上回答基于this answer。关于外键的警告就像它在上面的部分中一样。
一次性去除
如果你只是想执行一个查询,不以任何方式修改表结构,和你有一个主键id
识别每一行,那么你可以尝试以下方法:
DELETE FROM business_users WHERE id NOT IN
(SELECT MIN(id) FROM business_users GROUP BY user_id, business_id);
this answer先前提出了类似的想法。
如果上述请求失败,因为你不能阅读,并在同一步骤从表中删除,您可以再次使用临时表:
CREATE TEMPORARY TABLE tmp
SELECT MIN(id) id FROM business_users GROUP BY user_id, business_id;
DELETE FROM business_users WHERE id NOT IN (SELECT id FROM tmp);
DROP TABLE tmp;
如果你想,你仍然可以在以这种方式清理数据之后引入唯一性约束。为此,请执行上一节中的ALTER TABLE
行。
3
既然你有一个主键,你可以用它来挑去相关的行:
delete from business_users
where id not in (
select id from (
select min(id) as id -- Make a list of the primary keys to keep
from business_users
group by user_id, business_id -- Group by your duplicated row definition
) as a -- Derived table to force an implicit temp table
);
这样一来,你就不会需要创建/删除临时表等(除implicit one )。
您可能想对user_id, business_id
设置一个唯一约束,因此您不必再担心这一点。
相关问题
- 1. 删除阵列中除1个以外的所有副本 - JavaScript
- 2. 删除SKSpriteNode的所有副本
- 3. 查找除一个以外的所有div id并删除类
- 4. NSIS - 删除除一个文件以外的所有文件
- 5. 删除除一个重复记录以外的所有记录
- 6. 从StackPanel中删除除第一个以外的所有项目?
- 7. 删除除第一个以外的所有活动
- 8. Prolog删除所有变量和副本
- 9. Windows Cmd行删除命令删除除一个以外的所有文件
- 10. Рhppreg_replace - 删除除html标记以外的所有文本IMG
- 11. 删除除格式以外的所有格式文本?
- 12. 删除除一些特殊字符以外的所有字符
- 13. 删除除VIM中第一列以外的所有内容
- 14. 删除除最新10个以外的所有目录
- 15. 删除除4个最新目录以外的所有文件
- 16. Shell - 删除除单个文件夹以外的所有内容
- 17. TCL删除所有以一个字符
- 18. 删除除“XYZ”外的所有行
- 19. 删除除PHP第一个之外的所有列表元素?
- 20. SQLite如何删除除一个之外的所有重复行?
- 21. 在MySql中删除除了一个之外的所有表格
- 22. 删除除了一个之外的所有注释引脚
- 23. 删除除一个之外的所有SMTP地址
- 24. Python删除除一个之外的所有子元素
- 25. 删除每个人的除最后一项以外的所有内容
- 26. 删除NSString中除一个字符以外的所有字符的实例
- 27. 删除CPP中的副本
- 28. 删除除一个目录以外的所有文件和目录
- 29. 从句子中删除除第一个单词以外的所有单词
- 30. 删除除一个特定字符以外的所有非数字字符
点击相关的问题。几个星期前,当我在寻找这个问题时,我发现了一些想法。我混合并匹配了几个以获得理想的结果。 – MetalFrog
你在这个表上有任何主键或其他唯一约束吗?或者'user_id'和'business_id'是唯一的列,这样整个行都会被复制? – ruakh
看起来像http://stackoverflow.com/questions/672702/how-to-delete-duplicates-in-mysql-table的副本?rq = 1 – cptScarlet