我继承了一个表,该表提供了如下所示的其他两个表之间的链接:
id | product_id | category_id
1 | 10 | 20
2 | 10 | 21
3 | 34 | 20
4 | 34 | 21
5 | 34 | 21
6 | 10 | 21在那里,结果是第2行和第6行,第4行和第5行是对。
如何编写查询以删除冗余行?
发布于 2013-09-28 11:04:06
您应该在product_id和category_id上添加一个唯一的键,这样就不可能再添加多余的行了,因为任何插入都会失败。
但是,只有首先删除冗余行,才能做到这一点。你可以通过这样的分组来找到它们:
SELECT id FROM table GROUP BY product_id, category_id HAVING COUNT(*) > 1在此之后,您可以从结果中提取ids,通过“,”分隔它们,然后运行以下delete查询:
DELETE FROM table WHERE id IN({comma separated list of id})发布于 2013-09-28 11:08:57
ALTER IGNORE TABLE 'tablename' ADD UNIQUE INDEX idx_name (id, product_id, category_id);这也将确保今后不再有重复的表格。
欲了解更多信息:Remove duplicate rows in MySQL
发布于 2013-09-28 11:17:21
创建一个临时表,该表将保存已重复的值:
CREATE TABLE y LIKE x;插入已重复的值:
INSERT INTO y (product_id, category_id)
SELECT product_id, category_id FROM x
GROUP BY product_id, category_id;交换表:
DROP TABLE x;
ALTER TABLE y RENAME x;现在,您可以在(product_id, category_id)上添加一个唯一的键,以防止进一步的重复插入。
https://stackoverflow.com/questions/19066182
复制相似问题