您好我遇到了一种情况,其中错误地没有删除表我运行了表的批处理文件,其中包含一些详细的插入语句
我有一个像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查询来完成
表格中没有主要关键
答案 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)
)