SQL删除特定范围内的记录

60

对于有经验的人来说,这可能是一个非常简单的问题,但我只想知道在SQL表中删除几百条记录的最安全方法。这些记录落在特定范围内。

例如,我需要删除ID在79和296之间的行:

我担心如果我说删除所有ID大于79且小于296的记录,那么它可能会删除整个表。


1
这是你应该能够自己测试的东西。如果你没有一个可以尝试 SQL(特别是 DML)的游乐场,那么你应该去弄一个。你还应该了解如何从语句执行失败中恢复。例如,更改你的环境,使其不自动提交。这样,如果一条语句删除了比你预期更多的记录,你就可以回滚。 - APC
1
你能不能先使用一条select语句测试一下呢? - danmc
@YvetteColomb,你链接的答案肯定是重复的,因为这个问题几乎两年前就被问过了。 - user964769
D.Mac,Q 可能是较新问题的重复(请参见 Meta),如果我们使用投票和浏览量作为代理,那么 Q 的 SEO 更好。... 不过,@YvetteColomb,我觉得将另一个 Q 关闭为此 Q 的重复更为合适。 - Brock Adams
7个回答

157

如果你使用 Sql Server

delete from Table where id between 79 and 296

注意:between语句是包含的,因此行79296也将被删除。

编辑后:您现在澄清了您想要的查询条件:

ID(>79 AND < 296)

因此,请使用以下语句:

delete from Table where id > 79 and id < 296


6
或者说几乎所有的SQL数据库。 - APC
1
问题中的条件是 ID (>79 AND < 296),这将删除 ID (>= 79 AND <= 296),当然这可能不是一个精确的问题 :-)。 - Michał Powaga
1
请注意:between语句是包容性的,因此第79行和第296行也将被删除。 - xinthose
@xinthose 谢谢你提到这个问题,我觉得回答者也应该提到这一点。 - Amon
2
@Amon 完成了.......... - Royi Namir
显示剩余3条评论

19

如果给定的条件ID是(> 79且<296),则答案为:

delete from tab
where id > 79 and id < 296

这与以下代码等效:

delete from tab
where id between 80 and 295

如果 id 是整数。

所有答案:

delete from tab
where id between 79 and 296

这与以下代码等价:

delete from tab
where id => 79 and id <= 296

注意区别。


1
是的,谢谢这个...这正是我想要做的。我担心它会先删除大于79的所有内容,然后再删除小于296的所有内容,让我得到一个空表!也许我太担心了 :) - user964769
1
哈哈!那将是 delete from tab where id => 79 OR id <= 296 - 注意使用 OR 而不是 AND,这将使它等同于分别运行两个查询。如果 ID 是非空整数,则确实会删除所有内容。如果 ID 可以为 NULL,则这些行将保留。 - Konerak

4
DELETE FROM table_name 
WHERE id BETWEEN 79 AND 296;

1

你也可以将删除操作改为选择所有 (*)

并测试你的选择

所选记录将与已删除的记录相同

如果不确定,你还可以在语句中加入 BEGIN / ROLLBACK - 先测试语句,如果一切正常再移除回滚

例如:

SELECT * FROM table WHERE id BETWEEN 79 AND 296

将显示所有匹配 WHERE 的记录 如果它们是你“真正”想要删除的,则使用

DELETE FROM table WHERE id BETWEEN 79 AND 296

你还可以创建一个触发器/捕获删除并将其放入历史表中

因此,如果你误删了某些内容,你总是可以找回来

(保持历史表记录不超过6个月或任何业务规则规定的时间)


0
我的担心是,如果我说删除所有ID(>79 AND <296)的内容,那么它可能会直接清空整个表格...
这不会发生,因为你将有一个where子句。发生的情况是,如果你有一个像delete * from Table1 where id between 70 and 1296这样的语句,SQL查询处理器首先会扫描表格并查找该范围内的记录,然后应用删除操作。

0

如果您在SQL Server中按照以下方式编写,则不会有清除数据库表的危险,除非该表中的所有值实际上都在这些值之间:

DELETE FROM [dbo].[TableName] WHERE [TableName].[IdField] BETWEEN 79 AND 296 

-1

你可以使用这种方式,因为在某些情况下id可能不是连续的。

SELECT * 
FROM  `ht_news` 
LIMIT 0 , 30

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接