如何删除 MySQL 表中的重复项
Posted
技术标签:
【中文标题】如何删除 MySQL 表中的重复项【英文标题】:How to delete Duplicates in MySQL table 【发布时间】:2009-03-23 09:37:17 【问题描述】:我已向客户提供以下查询以删除重复的电话号码。 MSSQL 数据库中的记录,但现在他们还需要在 mysql 上执行此操作,并且他们报告说 MySQL 抱怨查询的格式。我已经为我的代码示例设置了一个带有重复项的测试表,但实际的删除查询才是最重要的。
我在无知和紧迫的情况下问这个问题,因为我仍在忙于下载和安装 MySQL,也许在此期间有人可以提供帮助。
create table bkPhone
(
phoneNo nvarchar(20),
firstName nvarchar(20),
lastName nvarchar(20)
)
GO
insert bkPhone values('0783313780','Brady','Kelly')
insert bkPhone values('0845319792','Mark','Smith')
insert bkPhone values('0834976958','Bill','Jones')
insert bkPhone values('0845319792','Mark','Smith')
insert bkPhone values('0828329792','Mickey','Mouse')
insert bkPhone values('0834976958','Bill','Jones')
alter table bkPhone add phoneId int identity
delete from bkPhone
where phoneId not in
(
select min(phoneId)
from bkPhone
group by phoneNo,firstName,lastName
having count(*) >= 1
)
【问题讨论】:
对我来说看起来不错。他们是否使用支持子查询的 MySQL 版本? 为什么having count(*) >= 1
??什么时候不是?
【参考方案1】:
通往罗马的方式有很多。这是一。它非常快。因此,您可以将它与大型数据库一起使用。不要忘记不雅。 诀窍是:使 phoneNo 唯一并使用“ignore”。
drop table if exists bkPhone_template;
create table bkPhone_template (
phoneNo varchar(20),
firstName varchar(20),
lastName varchar(20)
);
insert into bkPhone_template values('0783313780','Brady','Kelly');
insert into bkPhone_template values('0845319792','Mark','Smith');
insert into bkPhone_template values('0834976958','Bill','Jones');
insert into bkPhone_template values('0845319792','Mark','Smith');
insert into bkPhone_template values('0828329792','Mickey','Mouse');
insert into bkPhone_template values('0834976958','Bill','Jones');
drop table if exists bkPhone;
create table bkPhone like bkPhone_template;
alter table bkPhone add unique (phoneNo);
insert ignore into bkPhone (phoneNo,firstName,lastName) select phoneNo,firstName,lastName from bkPhone_template;
drop table bkPhone_template;
如果数据表已经存在,那么您只需要使用以下插入忽略选择运行创建表选择。最后,您必须运行一些表重命名语句。就是这样。
这种解决方法比删除操作要快得多。
【讨论】:
感谢您对 MySQL 的两部分教育。我现在有“喜欢”来创建表,而“忽略”在我的武器库中。 注意顺便说一句(由于重复链接,在回答后很长时间才评论)您可以只使用ALTER IGNORE TABLE ADD UNIQUE(phoneNo)
,它会默默地丢弃表中的重复项,而无需创建另一个。【参考方案2】:
您可以通过以下方式选择唯一的:
select distinct(phoneNo) from bkPhone
并将它们放入另一个表中,删除旧表并将新表重命名为旧名称。
【讨论】:
鉴于场景的简单性,允许新建和删除表,这是最简单的。最有效的解决方案。谢谢。【参考方案3】:MySQL 抱怨,因为它没有任何意义。您尝试使用您分组的min()
列进行聚合。
现在,如果您要删除同一个人的重复电话号码,SQL 应该是:
delete from bkPhone
where phoneId not in
(
select min(phoneId)
from bkPhone
group by firstName,lastName /* i.e. grouping by person and NOT grouping by phoneId */
having count(*) >= 1
)
【讨论】:
太棒了。这个可爱的having
子句的另一个用例:-) 但我认为你应该写>
,而不是>=
。这可能会加速事情的发展
我根本看不出这个having
的意义。就目前而言,它应该始终是正确的,因此毫无意义。如果将其更改为>1
,则内部select
将省略没有 重复的行,因此外部delete
将删除。我相信这不是你想要的。
@LukasEder:>
将删除所有只有一个电话的条目。我想你没有注意到条件中有not
。
"#1093 - 您不能在 FROM 子句中指定目标表 'bkPhone' 进行更新" SQL Fiddle 说【参考方案4】:
Mysql 还包括:
http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html
【讨论】:
以上是关于如何删除 MySQL 表中的重复项的主要内容,如果未能解决你的问题,请参考以下文章