如何删除仅通过 ID 不同的两行
Posted
技术标签:
【中文标题】如何删除仅通过 ID 不同的两行【英文标题】:How do I delete two rows that differ only by ID 【发布时间】:2008-12-19 01:13:51 【问题描述】:我有一个脚本,它使用相同的数据两次插入到数据库中。有没有好的方法(不扫描,将每条记录插入数组,然后删除重复的数组条目)?
【问题讨论】:
【参考方案1】:DELETE
FROM t
WHERE ID IN (
SELECT MAX(ID)
FROM t
GROUP BY Your Group Criteria Here
HAVING COUNT(*) > 1
)
【讨论】:
DELETE FROM Resources WHERE Id IN (SELECT MAX(Id) FROM Resources GROUP BY Filename HAVING COUNT(*) >1) mysql 说:文档 #1093 - 你不能指定目标表“资源”用于 FROM 子句中的更新 我认为如果我在比尔的答案中指定两个表格,这将起作用。 抱歉,它在 MySQL 上不起作用——我很确定这是 ANSI。【参考方案2】:MySQL 支持多表删除,这真的很酷,可以在这里提供帮助。您可以对除id
之外的所有列的相等性进行自连接,然后删除具有更大id
的匹配行。
DELETE t2
FROM mytable t1 JOIN mytable t2
USING (column1, column2, column3) -- this is an equi-join
WHERE t1.id < t2.id;
【讨论】:
【参考方案3】:或者旧的简单方法,如果它不是最快的,我会感到惊讶。比匹配 GROUP BY 聚合函数更快。
从 mytable m1 中删除 存在于何处 ( 从我的表中选择 1 WHERE 字段 = m1.fields AND id
【讨论】:
不,如果多于两个或少于两个(即 1),它可以正常工作。保留没有记录具有较低 id 的记录。【参考方案4】:如果您现在没有通过键引用表的任何内容,我会 mysqldump --complete-insert 它,剥离主键,更改表定义以强制执行一些唯一键或其他可以捕获您的重复,将 INSERT 更改为 REPLACE,然后重新加载数据。为您提供一个干净的表,在 PK 序列中没有漏洞或删除的行。
【讨论】:
以上是关于如何删除仅通过 ID 不同的两行的主要内容,如果未能解决你的问题,请参考以下文章
如何使用端点而不是仅使用一个 ID 传递要删除的 ID 数组