【问题标题】:Delete double rows when columns have identical entries [duplicate]当列具有相同的条目时删除双行[重复]
【发布时间】:2014-06-08 17:32:27
【问题描述】:

我有一个带有自动增量列 (id) 的数据库表 (test_table),当 3 个特定列(A、B、C)具有相同的条目时,我想删除所有双(或更多)条目。

    id    column_A    column_B    column_C
------------------------------------------------
    1     ooo         aaa         uuu
    2     ooo         aaa         uuu
    3     ttt         ppp         uuu
    4     ooo         aaa         uuu
    5     iii         kkk         ccc

在本例中,id 为 24 的行应在执行 DELETE 查询后删除。

问候。

【问题讨论】:

  • 您是说第一个响应始终是应该保留的正确响应吗?如果总是这样,您可以将列作为您的“主键”,它本质上不允许被欺骗吗?不是修复,而是最佳实践……
  • @Silvertiger:我实际上正在清理现有数据库。留下哪个自动增量键并不重要,重要的是双倍的条目被删除并且其中一行保留。

标签: php mysql sql delete-row sql-delete


【解决方案1】:
DELETE FROM tbl
WHERE `id` NOT IN ( SELECT * FROM (
                                SELECT MIN(`id`) 
                                FROM tbl
                                GROUP BY `column_A`
                                       , `column_B`
                                       , `column_C` 
                              ) x
              )

SQLFiddle

【讨论】:

  • @lickmycode :因为你不能在UPDATE/INSERT/DELETE查询的WHERE子句中使用永久表,所以x这里是表示为临时表.
【解决方案2】:

您可以在删除查询中使用自连接,连接中的子查询将连接重复的行,条件t.id > tt.id 将保留带有id的最少记录,其他重复的将被删除

delete t.* from t
join (
select * from t 
group by `column_A`, `column_B`, `column_C`
having count(*) > 1
) tt 
  on(t.`column_A` = tt.`column_A`
          AND t.`column_B` = tt.`column_B`
          AND t.`column_C` = tt.`column_C` 
         AND t.id > tt.id)

我已经添加了一份第 5 行的副本来测试它

Demo

【讨论】:

  • 谢谢你把小提琴放在一起。
  • 通过这个查询我得到一个 SQL 错误#1205 - Lock wait timeout exceeded; try restarting transaction。使用 InnoDB 表。此查询是否比 Notulysses 提供的查询占用更多资源?
【解决方案3】:
DELETE x
  FROM t x
  LEFT
  JOIN
     ( SELECT column_a
            , column_b
            , column_c
            , MIN(id) min_id
         FROM t
        GROUP 
           BY column_a
            , column_b
            , column_c
     ) y
    ON y.column_a = x.column_a
   AND y.column_b = x.column_b
   AND y.column_c = x.column_c
   AND y.min_id = x.id
 WHERE y.min_id IS NULL 

http://www.sqlfiddle.com/#!2/b1b679/1

【讨论】:

    【解决方案4】:

    作为一种快速的可能性,我从https://www.linkedin.com/groups/How-delete-duplicate-rows-in-78638.S.218942398 借了这个:

    第 1 步:将非重复项(唯一元组)移动到临时表中

    CREATE TABLE new_table AS
    SELECT * FROM old_table WHERE 1 GROUP BY [COLUMN TO remove duplicates BY];
    

    第二步:删除旧表

    DROP TABLE old_table;
    

    第 3 步:将 new_table 重命名为 old_table 的名称

    RENAME TABLE new_table TO old_table;
    

    然后您可以编辑新表,将 A 列作为主键,不再发生重复。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多