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,我可以使用:
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)
| 归档时间: |
|
| 查看次数: |
30465 次 |
| 最近记录: |