如何在没有 ID 的表中删除 MySQL 中的重复记录?

Edw*_*abu 3 mysql delete duplication mysql-5.7

我需要删除此表中的重复记录。但是,id每一行都没有。

示例数据

产品 数量 数量
桌子 2000年 5
椅子 300 25
电视 30000 4
自行车 300 25
桌子 2000年 5
椅子 300 25
椅子 300 25

预期成绩

我需要得到这个结果。

产品 数量 数量
桌子 2000年 5
椅子 300 25
电视 30000 4
自行车 300 25

带 ID 的脚本

如果有id,我可以使用:

DELETE p1 FROM products p1
INNER JOIN products p2 
WHERE p1.id < p2.id AND p1.product = p2.product;
Run Code Online (Sandbox Code Playgroud)

Aki*_*ina 14

没有任何字段组合可以唯一地标识记录。

我看到至少 2 种不同的解决方案。

第一种解决方案:将唯一记录移动到表的副本并替换原始表。

CREATE TABLE temp LIKE products;
INSERT INTO temp 
    SELECT DISTINCT * FROM products;
DROP TABLE products;
RENAME TABLE temp TO products;
Run Code Online (Sandbox Code Playgroud)

第二种解决方案:添加临时自动增量,使用它删除记录,并删除临时字段。

ALTER TABLE products ADD COLUMN temp SERIAL PRIMARY KEY;
DELETE t1.* 
    FROM products t1 
    LEFT JOIN ( SELECT MIN(temp) mintemp 
                FROM products
                GROUP BY field1,field2 /* , ... */ , fieldN) t2 
        ON t1.temp=t2.mintemp 
    WHERE t2.mintemp IS NULL;
ALTER TABLE products DROP COLUMN temp;
Run Code Online (Sandbox Code Playgroud)

更新

在第二种变体中:作为主键的附加列定义是多余的。使用就够了

ALTER TABLE products ADD COLUMN temp SERIAL;
Run Code Online (Sandbox Code Playgroud)