【问题标题】:MySQL - How to delete duplicate rows (but leave 1 row) given 2 columns?MySQL - 如何删除给定 2 列的重复行(但保留 1 行)?
【发布时间】:2016-02-05 21:41:30
【问题描述】:

此表只有 2 列。当行的两列都匹配时,有些行被视为“重复”。

即:

col1 col2
X    X
X    X
X    Y  -- this is not a duplicate

我想删除重复项,但至少保留其中一个。哪个没关系,因为它们是同一个东西。

我使用了 INJOIN 的变体,但我似乎无法让 DELETE 外部查询仅删除具有重复列的每一行。

【问题讨论】:

标签: mysql


【解决方案1】:

试试这个:

DELETE  a
FROM    mytable a
        LEFT JOIN
        (
            SELECT MIN(ID) ID, col1, col2
            FROM    mytable
            GROUP   BY col1, col2
        ) b ON  a.ID = b.ID AND
                a.col1 = b.col1 AND
                a.col2 = b.col2
WHERE   b.ID IS NULL

DEMO

假设 ID 作为主键列

编辑:

但是,如果您没有 ID 列,那么您可以这样尝试:

ALTER IGNORE TABLE mytable
  ADD UNIQUE INDEX all_columns_uq
    (col1, col2) ;

DEMO

【讨论】:

  • "此表只有 2 列。"
【解决方案2】:
ALTER IGNORE TABLE table1 ADD UNIQUE INDEX idx_name (col1,col2);

CREATE TABLE table1_temp AS
SELECT * FROM table1 GROUP BY col1, col2;

TRUNCATE TABLE table1;
INSERT INTO table1 SELECT * FROM table1_temp;

DROP TABLE table1_temp;

您可能会在活动表上使用第二种方法丢失数据,任何其他引用它的表也可能不太高兴!

我建议也添加唯一索引,只是为了将来证明自己。

【讨论】:

  • @strawberry 请不要编辑我的答案以删除大块文本并进行自己的首选/肤浅更改。如果您想提出更改建议,请添加评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 2018-10-14
  • 1970-01-01
  • 2021-05-19
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多