2

我继承了一个表,它提供了两个其他表之间的链接,如下所示:

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 行是成对的。

如何编写查询以删除冗余行?

4

3 回答 3

1

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})
于 2013-09-28T11:04:06.757 回答
1
ALTER IGNORE TABLE 'tablename' ADD UNIQUE INDEX idx_name (id, product_id, category_id);

这也将确保表中不再有重复项。

更多信息:删除 MySQL 中的重复行

于 2013-09-28T11:08:57.377 回答
1

创建一个临时表来保存去重值:

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)以防止插入更多重复项。

于 2013-09-28T11:17:21.543 回答