2

我想运行以下 sql 命令:

ALTER TABLE `my_table` 添加唯一(
`ref_id` ,
`类型`
);

问题是表中的某些数据会使此无效,因此更改表失败。

MySQL中是否有一种巧妙的方法可以删除重复的行?

4

8 回答 8

4

SQL 充其量只能任意处理这个问题。换句话说:这是你的问题。

您有当前不是唯一的数据。你想让它独一无二。您需要决定如何处理重复项。

有多种处理方法:

  • 如果数字足够小,则手动修改或删除重复的行;
  • 运行语句以更新或删除符合特定标准的重复项,以达到可以单独处理异常的程度;
  • 将数据复制到临时表,清空原始数据并使用查询重新填充表;和
  • 很快。

注意:这些都需要用户干预。

您当然可以将表复制到临时表,清空原始表并复制行,而忽略那些失败的行,但我希望这不会给您真正想要的结果。

于 2009-06-15T14:14:48.790 回答
2

如果您不在乎删除哪一行,请使用 IGNORE:

ALTER IGNORE TABLE `my_table` ADD UNIQUE (
`ref_id` ,
`type`
);
于 2009-06-15T14:48:10.147 回答
0

您可以做的是在您的表中添加一个临时标识列。有了它,您可以编写查询来识别和删除重复项(您可以稍微修改查询以确保仅保留一组重复行中的一个副本)。

完成此操作后,删除临时列并将唯一约束添加到原始列。

希望这可以帮助。

于 2009-06-15T14:16:07.617 回答
0

我过去所做的是导出唯一的数据集,删除表,使用唯一列重新创建它并导入数据。

它通常比试图找出如何删除重复数据更快。

于 2009-06-15T14:19:23.727 回答
0

有一篇很好的知识库文章提供了逐步方法来查找和删除具有重复值的行。它提供了两种方法 - 一种用于查找和删除单行的一次性方法,以及在涉及多行时解决此问题的更广泛的解决方案。

http://support.microsoft.com/kb/139444

于 2009-06-15T14:24:49.610 回答
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
于 2009-06-15T15:16:20.500 回答
0

这对我有用:

ALTER TABLE table_name ADD UNIQUE KEY field_name (field_name)
于 2010-03-02T20:17:37.990 回答
-1

您将必须找到其他一些唯一的字段,因为仅删除 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/

于 2009-06-15T14:15:53.343 回答