我想运行以下sql命令:
ALTER TABLE `my_table` ADD UNIQUE ( `ref_id` , `type` );
问题是表中的某些数据会使其无效,因此更改表失败。
在MySQL中有一种聪明的方法可以删除重复的行吗?
答案 0 :(得分:4)
SQL最多可以任意处理。换句话说:这是你的问题。
您的数据目前不是唯一的。你想让它独一无二。您需要决定如何处理重复项。
有多种方法可以解决这个问题:
注意:这些都需要用户干预。
你当然可以将表复制到临时表中,清空原始文件并复制到行中,只是忽略那些失败但我希望它不会给你真正想要的结果。
答案 1 :(得分:2)
如果您不关心删除哪一行,请使用IGNORE:
ALTER IGNORE TABLE `my_table` ADD UNIQUE (
`ref_id` ,
`type`
);
答案 2 :(得分:0)
您可以执行的操作是向表中添加临时标识列。有了它,您可以编写查询来识别和删除重复项(您可以稍微修改查询以确保只保留重复行集中的一个副本)。
完成此操作后,删除临时列并将唯一约束添加到原始列。
希望这有帮助。
答案 3 :(得分:0)
我过去所做的是导出唯一的数据集,删除表格,使用唯一列重新创建数据并导入数据。
通常比试图找出如何删除重复数据更快。
答案 4 :(得分:0)
有一篇很好的知识库文章,它提供了一种逐步查找和删除具有重复值的行的方法。它提供了两种方法 - 一种用于查找和删除单行的一次性方法,以及一种在涉及多行时解决此问题的更广泛的解决方案。
答案 5 :(得分:0)
以下是我用于删除其中一个表
中的重复行的代码段BEGIN TRANSACTION
Select *,
rank() over (Partition by PolicyId, PlanSeqNum, BaseProductSeqNum,
CoInsrTypeCd, SupplierTypeSeqNum
order by CoInsrAmt desc) as MyRank
into #tmpTable
from PlanCoInsr
select distinct PolicyId,PlanSeqNum,BaseProductSeqNum,
SupplierTypeSeqNum, CoInsrTypeCd, CoInsrAmt
into #tmpTable2
from #tmpTable where MyRank=1
truncate table PlanCoInsr
insert into PlanCoInsr
select * from #tmpTable2
drop table #tmpTable
drop table #tmpTable2
COMMIT
答案 6 :(得分:0)
这对我有用:
ALTER TABLE table_name ADD UNIQUE KEY field_name (field_name)
答案 7 :(得分:-1)
您必须找到一些独特的其他字段,因为在ref_id上删除并单独输入将全部删除它们。
获取重复项:
select ref_id, type from my_table group by ref_id, type having count(*)>1
Xarpb有一些聪明的技巧(可能太聪明):http://www.xaprb.com/blog/2007/02/06/how-to-delete-duplicate-rows-with-sql-part-2/