在 MySQL 中删除具有范围的行
当尝试使用 MySQL 中的 LIMIT 子句从表中删除特定范围的行时,可能会发生错误。为了说明这一点,以下查询的目标是删除 50 行的范围,从第 20 行开始按时间戳降序排列:
DELETE FROM `chat_messages` ORDER BY `timestamp` DESC LIMIT 20, 50;
但是,在执行此查询时,会遇到错误消息,因为无效的语法,特别是在 OFFSET 值(50)处。
DELETE 语句中 LIMIT 子句的限制
错误的根本原因在于无法使用DELETE 语句的 LIMIT 子句中的 OFFSET。这与 SELECT 语句有显着区别,后者允许 LIMIT 和 OFFSET 指定要检索的起始点和行数。
范围删除的解决方法
至为了规避这个限制,需要一种解决方法。通过利用嵌套在 DELETE 语句中的子查询,可以准确地定位和删除行范围。此方法涉及以下步骤:
以下是使用此解决方法修改查询的示例:
DELETE FROM `chat_messages` WHERE `id` IN ( SELECT `id` FROM ( SELECT `id` FROM `chat_messages` ORDER BY `timestamp` DESC LIMIT 20, 50 ) AS `x` )
在此查询中,主查询假定键列 id,但可以在您的特定场景中将其修改为适当的列名称。
以上是如何在 DELETE 语句中不使用 OFFSET 的情况下删除 MySQL 中的一系列行?的详细内容。更多信息请关注PHP中文网其他相关文章!