MySQL - 如何删除给定2列的重复行(但留下1行)?

时间:2016-02-05 12:57:37

标签: mysql

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

那是:

ALTER TABLE registrations
  ADD CONSTRAINT proper_confirmation_status CHECK
    (confirmation_status::text ~ '^(Unconfirmed|Confirmed|Rejected|NotApplicable)$');

我想删除重复项,但至少留下其中一项。因为它们是同一个东西并不重要。

我使用了col1 col2 X X X X X Y -- this is not a duplicate IN的变体,但我似乎无法让DELETE外部查询只删除每一行中有重复列的行。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

ALTER IGNORE TABLE table1 ADD UNIQUE INDEX idx_name (col1,col2);

OR

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;

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

我建议添加唯一索引,以便将来证明自己。