将表字段更改为UNIQUE

时间:2009-06-15 14:12:26

标签: sql mysql unique

我想运行以下sql命令:

ALTER TABLE `my_table` ADD UNIQUE (
`ref_id` ,
`type`
);

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

在MySQL中有一种聪明的方法可以删除重复的行吗?

8 个答案:

答案 0 :(得分:4)

SQL最多可以任意处理。换句话说:这是你的问题。

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

有多种方法可以解决这个问题:

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

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

你当然可以将表复制到临时表中,清空原始文件并复制到行中,只是忽略那些失败但我希望它不会给你真正想要的结果。

答案 1 :(得分:2)

如果您不关心删除哪一行,请使用IGNORE:

ALTER IGNORE TABLE `my_table` ADD UNIQUE (
`ref_id` ,
`type`
);

答案 2 :(得分:0)

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

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

希望这有帮助。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

答案 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/