如何删除表中重复的记录?

时间:2012-10-15 07:55:49

标签: mysql sql

您好我遇到了一种情况,其中错误地没有删除表我运行了表的批处理文件,其中包含一些详细的插入语句

我有一个像alert_priority这样的表,包括像

这样的记录
Id  priority_name
---  --------------
1     P0
2     P1
3     P2

现在错误地没有丢弃 alert_priority 我已经执行了包含一些插入语句的表的脚本文件,现在执行脚本后我的记录就像

Id  priority_name
---  --------------
1     P0
2     P1
3     P2
1     P0
2     P1
3     P2

现在我要删除额外的记录(Id 3之后的记录),我应该拥有在执行脚本文件之前存在的所有记录。

虽然我有一个选项可以删除表并再次执行脚本文件,但我想知道有什么方法可以通过sql查询来完成
表格中没有主要关键

6 个答案:

答案 0 :(得分:2)

首先,考虑将ID字段设置为AI(自动增量)甚至PK(主键)。

为了删除那些重复的行,我们将创建一个新表并将全部移动 那些重复的行到它。 在那之后,放下那张桌子。

  

CREATE TEMPORARY TABLE bad_temp AS SELECT DISTINCT * FROM alert_priority

答案 1 :(得分:1)

您可以将所有唯一记录复制到新表中,然后删除旧表:

SELECT DISTINCT * INTO new_table FROM old_table

答案 2 :(得分:1)

在SQL-Server中使用ROW_NUMBER会很容易,但是alas MySQL没有这样的功能: - (

解决问题的最佳方法如下:

  • 创建一个与第一个结构相同的新表,但没有 数据。
  • 使用查询:INSERT INTO name_of_new_table SELECT DISTINCT * FROM name_of_old_table
  • 放下旧桌子
  • 将新表重命名为旧表的调用。

答案 3 :(得分:1)

CREATE TABLE new_tbl(id int AUTO_INCREMENT,priority_name);

INSERT INTO new_tbl
select priority_name from old_tbl group by priority_name;

答案 4 :(得分:0)

要删除重复的新行并保留旧的行(基于我假设已有其他行的行指向原始行): -

DELETE FROM alert_priority
WHERE Id IN (SELECT MaxId
FROM (SELECT priority_name, MAX(Id) AS MaxId, COUNT(Id)  AS CountId
FROM alert_priority
GROUP BY priority_name
HAVING CountId > 1))

答案 5 :(得分:0)

以下查询将为您提供您要保留的所有记录:

SELECT min(id)
FROM alert_priority
GROUP BY priority_name
HAVING count(*) > 1
    OR min(id) = max(id)

要删除所有重复项,请运行以下查询:

DELETE FROM alert_priority
WHERE id NOT IN (
    SELECT min(id)
    FROM alert_priority
    GROUP BY priority_name
    HAVING count(*) > 1
        OR min(id) = max(id)
)