如何删除MySQL表中的重复项

我给了一个客户端下面的查询删除重复的电话号码。 logging在MSSQL数据库中,但是现在他们也需要在MySQL上做这件事,并且他们报告说MySQL抱怨查询的格式。 我已经包含了一个testing表的设置与我的代码示例重复,但实际的删除查询是重要的。

我在无知和紧急的时候问这个,因为我还在忙着下载和安装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 ) 

通往罗马的方式很多。 这是一个。 这是非常快的。 所以你可以使用它与大数据库。 不要忘记这个意思。 诀窍是:使电话不唯一,并使用“忽略”。

 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; 

如果数据表已经存在,那么你只需要运行一个create tableselect一个以下的insert ignore select。 最后你必须运行一些表格重命名语句。 就这样。

这个解决方法比删除操作快得多。

您可以通过以下方式select唯一的:

 select distinct(phoneNo) from bkPhone 

并把它们放到另一个表中,删除旧表并将新的名称重命名为旧名称。

MySQL抱怨,因为它没有任何意义。 您尝试使用您分组的min()列进行聚合。

现在,如果您要删除同一个人的重复电话号码,则SQL应为:

 delete from bkPhone where phoneId not in ( select min(phoneId) from bkPhone group by firstName,lastName /* ie grouping by person and NOT grouping by phoneId */ having count(*) >= 1 )