如何删除仅通过 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 不同的两行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL删除重复行保留一个[关闭]

如何使用端点而不是仅使用一个 ID 传递要删除的 ID 数组

如何在 Scala Spark 中删除两行分隔符值之间的部分文件? [关闭]

如何比较同一表中的两行并使用存储过程返回数据作为响应

如何更新表值

如果变量仅填充一年,如何删除ID?