我在MYSQL数据库中有一个表('sales'),它应该有一个强制执行的唯一约束来防止重复.首先删除欺骗并设置约束证明有点棘手.
表结构(简化):
目标是强制product_id的唯一性.我想要应用的重复数据删除策略是删除除最近创建的所有重复记录,例如:最高ID.
或者换句话说,我想只删除重复记录,不包括与以下查询匹配的ID,同时还保留现有的非duped记录:
select id
from sales s
inner join (select product_id,
max(id) as maxId
from sales
group by product_id
having count(product_id) > 1) groupedByProdId on s.product_id
and s.id = groupedByProdId.maxId
Run Code Online (Sandbox Code Playgroud)
我在两个方面都苦苦挣扎 - 编写查询以选择要删除的正确记录,然后是MYSQL中的约束,其中DELETE的子选择FROM子句不能引用从中删除数据的同一个表.
我检查了这个答案,它似乎处理了这个问题,但似乎特定于sql-server,虽然我不会从复制另一个问题中排除这个问题.
And*_*mar 11
在回复您的评论时,这是一个在MySQL中有效的查询:
delete YourTable
from YourTable
inner join YourTable yt2
on YourTable.product_id = yt2.product_id
and YourTable.id < yt2.id
Run Code Online (Sandbox Code Playgroud)
这只会删除重复的行.该inner join会过滤掉的最新行的每个产品,即使不存在其他行相同的产品.
PS如果您尝试对表进行别名FROM,MySQL要求您指定数据库的名称,如:
delete <DatabaseName>.yt
from YourTable yt
inner join YourTable yt2
on yt.product_id = yt2.product_id
and yt.id < yt2.id;
Run Code Online (Sandbox Code Playgroud)
也许用ALTER IGNORE TABLE ... ADD UNIQUE KEY.例如:
describe sales;
+------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| product_id | int(11) | NO | | NULL | |
+------------+---------+------+-----+---------+----------------+
select * from sales;
+----+------------+
| id | product_id |
+----+------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 3 |
| 6 | 2 |
+----+------------+
ALTER IGNORE TABLE sales ADD UNIQUE KEY idx1(product_id), ORDER BY id DESC;
Query OK, 6 rows affected (0.03 sec)
Records: 6 Duplicates: 3 Warnings: 0
select * from sales;
+----+------------+
| id | product_id |
+----+------------+
| 6 | 2 |
| 5 | 3 |
| 2 | 1 |
+----+------------+
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅此pythian帖子.
请注意,ids以相反的顺序结束.我不认为这很重要,因为ids的顺序在数据库中无关紧要(据我所知!).但是,如果这让您感到不满,那么上面链接的帖子也会显示解决此问题的方法.但是,它涉及创建一个临时表,它需要比我上面发布的就地方法更多的硬盘空间.
| 归档时间: |
|
| 查看次数: |
5182 次 |
| 最近记录: |