我想运行以下 sql 命令:
ALTER TABLE `my_table` 添加唯一( `ref_id` , `类型` );
问题是表中的某些数据会使此无效,因此更改表失败。
MySQL中是否有一种巧妙的方法可以删除重复的行?
SQL 充其量只能任意处理这个问题。换句话说:这是你的问题。
您有当前不是唯一的数据。你想让它独一无二。您需要决定如何处理重复项。
有多种处理方法:
注意:这些都需要用户干预。
您当然可以将表复制到临时表,清空原始表并复制行,而忽略那些失败的行,但我希望这不会给您真正想要的结果。
如果您不在乎删除哪一行,请使用 IGNORE:
ALTER IGNORE TABLE `my_table` ADD UNIQUE (
`ref_id` ,
`type`
);
您可以做的是在您的表中添加一个临时标识列。有了它,您可以编写查询来识别和删除重复项(您可以稍微修改查询以确保仅保留一组重复行中的一个副本)。
完成此操作后,删除临时列并将唯一约束添加到原始列。
希望这可以帮助。
我过去所做的是导出唯一的数据集,删除表,使用唯一列重新创建它并导入数据。
它通常比试图找出如何删除重复数据更快。
有一篇很好的知识库文章提供了逐步方法来查找和删除具有重复值的行。它提供了两种方法 - 一种用于查找和删除单行的一次性方法,以及在涉及多行时解决此问题的更广泛的解决方案。
这是我用来删除其中一个表中重复行的片段
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
这对我有用:
ALTER TABLE table_name ADD UNIQUE KEY field_name (field_name)
您将必须找到其他一些唯一的字段,因为仅删除 ref_id 和 type 就会将它们全部删除。
要获取重复项:
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/