我继承了一个表,它提供了两个其他表之间的链接,如下所示:
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 行是成对的。
如何编写查询以删除冗余行?
我继承了一个表,它提供了两个其他表之间的链接,如下所示:
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 行是成对的。
如何编写查询以删除冗余行?
product_id
您应该在and上添加一个唯一键category_id
,然后将不再可能添加冗余行,因为任何插入都会失败。
但是,只有在我们首先删除冗余行时,您才能这样做。您可以通过这样的分组来找到它们:
SELECT id FROM table GROUP BY product_id, category_id HAVING COUNT(*) > 1
之后,您可以将结果中的 id 用 ',' 分隔,并运行以下删除查询:
DELETE FROM table WHERE id IN({comma separated list of id})
ALTER IGNORE TABLE 'tablename' ADD UNIQUE INDEX idx_name (id, product_id, category_id);
这也将确保表中不再有重复项。
更多信息:删除 MySQL 中的重复行
创建一个临时表来保存去重值:
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)
以防止插入更多重复项。