1

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

我有一个像 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 查询来完成
我的表中没有主键

4

6 回答 6

2

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

为了删除那些重复的行,我们将创建一个新表并将所有这些重复的行移到其中。之后,删除该表。

创建临时表 bad_temp AS SELECT DISTINCT * FROM alert_priority

于 2012-10-15T08:00:59.460 回答
1

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

SELECT DISTINCT * INTO new_table FROM old_table
于 2012-10-15T08:00:17.167 回答
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;
于 2012-10-15T08:06:11.303 回答
1

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

解决它的最佳方法如下:

  • 创建一个与第一个结构相同但没有数据的新表。
  • 使用查询:INSERT INTO name_of_new_table SELECT DISTINCT * FROM name_of_old_table
  • 丢弃旧表
  • 将新表重命名为旧表的名称。
于 2012-10-15T08:01:15.670 回答
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))
于 2012-10-15T08:09:29.243 回答
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)
)
于 2012-10-15T08:30:08.413 回答