【问题标题】:Changing table field to UNIQUE将表字段更改为 UNIQUE
【发布时间】:2009-06-15 14:12:25
【问题描述】:

我想运行下面的sql命令:

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

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

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

【问题讨论】:

  • 您使用的是哪个 DBMS? SQL Server?
  • ...为什么你的表上没有一个主键?
  • @Eric - 这是唯一的复合键,而不是 PK。

标签: sql mysql unique


【解决方案1】:

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

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

有多种处理方式:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,效果很好,我不知道 IGNORE 关键字
    【解决方案3】:

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 过程本身不是 SQL Server 特定的。
        【解决方案6】:

        这是我用来删除其中一个表中重复行的sn-p

        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
        

        【讨论】:

          【解决方案7】:

          这对我有用:

          ALTER TABLE table_name ADD UNIQUE KEY field_name (field_name)
          

          【讨论】:

            【解决方案8】:

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

            【讨论】:

            • 你确定这个吗?看起来它可能会删除所有重复项(而不是留下 1 个)
            • 选择永远不会删除任何东西......我想我还是值得投反对票。
            猜你喜欢
            • 1970-01-01
            • 2011-10-15
            • 2011-06-12
            • 1970-01-01
            • 2012-07-24
            • 2019-02-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多