从 table 中删除部分重复的行
Deleting partially duplicate rows from a table
我们有一个具有以下架构的 table:
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(128) | YES | | NULL | |
| label | varchar(10) | NO | | NULL | |
| f1 | varchar(8) | YES | | NULL | |
| f2 | varchar(6) | YES | | NULL | |
+--------+------------------+------+-----+---------+----------------+
我们希望将名称标签对不明显的所有行视为重复行(即忽略 f1 和 f2)。在这种情况下,我们希望通过仅保留具有最高 id 的行来删除重复行(顺便说一句,稍后会在 table 中输入,因此假定它是最新的)。
在 MySQL 5.6.51 中实现它的最有效方法是什么?
JOIN 本身并删除较小的行 id
DELETE a
FROM duplicates a
JOIN duplicates b ON a.label = b.label AND a.name = b.name
WHERE a.id < b.id
name
可能是 NULL
,如果 NULL
被认为是重复的:
DELETE a
FROM duplicates a
JOIN duplicates b ON a.label = b.label AND COALESCE(a.name, '') = COALESCE(b.name, '')
WHERE a.id < b.id
我们有一个具有以下架构的 table:
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(128) | YES | | NULL | |
| label | varchar(10) | NO | | NULL | |
| f1 | varchar(8) | YES | | NULL | |
| f2 | varchar(6) | YES | | NULL | |
+--------+------------------+------+-----+---------+----------------+
我们希望将名称标签对不明显的所有行视为重复行(即忽略 f1 和 f2)。在这种情况下,我们希望通过仅保留具有最高 id 的行来删除重复行(顺便说一句,稍后会在 table 中输入,因此假定它是最新的)。
在 MySQL 5.6.51 中实现它的最有效方法是什么?
JOIN 本身并删除较小的行 id
DELETE a
FROM duplicates a
JOIN duplicates b ON a.label = b.label AND a.name = b.name
WHERE a.id < b.id
name
可能是 NULL
,如果 NULL
被认为是重复的:
DELETE a
FROM duplicates a
JOIN duplicates b ON a.label = b.label AND COALESCE(a.name, '') = COALESCE(b.name, '')
WHERE a.id < b.id