[英]Mysql: How to delete all duplicates that violate UNIQUE constraint
我想向表添加UNIQUE索引,如下所示:
ALTER TABLE `mytable` ADD UNIQUE `myunique_name`(`first`, `second`, `third`);
Mysql响应:
Duplicate entry '1-2-3' for key 'myunique_name'
我肯定知道,这种组合只是违反约束的千分之一。
在这种特殊情况下,我可以确定三个指定列中包含相同值的所有行在其他相关字段中也包含相同的数据(主索引当然不同,但是无关紧要),因此所有重复项都可以被删除。
有没有一种方法可以删除所有重复的条目但保留一个 (不管保留哪个主键都没有关系)以便可以添加唯一索引?
CREATE TEMPORARY TABLE IF NOT EXISTS MyTable engine=memory
select 1 as id, 1 col1,1 col2,1 col3
union all
select 2 as id, 2 col1,2 col2,2 col3
union all
select 3 as id, 3 col1,3 col2,3 col3
union all
select 4 as id, 4 col1,4 col2,4 col3
union all
select 5 as id, 1 col1,1 col2,1 col3
union all
select 6 as id, 2 col1,2 col2,2 col3
CREATE TEMPORARY TABLE IF NOT EXISTS MyDuplicateTableWithCount engine=memory
select col1 , col2 , col3, count(*) Count_1
from MyTable
group by col1 , col2 , col3
having count(*)>1
select a.* from MyTable a
inner join
(select col1 , col2 , col3
from MyDuplicateTableWithCount
) b
on a.col1 =b.col1 and a.col2 =b.col2 and a.col3 =b.col3
order by a.id
获得重复ID后,编写删除查询,指定重复ID为
delete from myTable where id in (5,6)
还可以从上方使用myTable使用以下查询
CREATE TEMPORARY TABLE IF NOT EXISTS MyTable2 engine=memory
SELECT MIN(id) as id, Col1, Col2, Col3
FROM MyTable
GROUP BY Col1, Col2, Col3
DELETE a FROM MyTable as a
LEFT JOIN (
SELECT * from MyTable2
) as b ON
b.id = a.id
WHERE
b.id IS NULL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.