【问题标题】:MySQL DELETE With Limit After OffsetMySQL DELETE 偏移后有限制
【发布时间】:2021-12-29 02:45:47
【问题描述】:

希望这是一个简单的问题,我忽略了一些微不足道的事情,但我似乎无法在相当多的搜索中找到答案。

在执行 SELECT 查询时,我可以像这样执行 LIMIT:

SELECT * FROM `table` LIMIT 20,20

从偏移量 20 开始最多检索 20 行。

现在,假设我想删除我选择的那些行?

人们可能期望能够做到这一点:

DELETE FROM `table` LIMIT 20,20

但是,无论出于何种原因,这不是 MySQL 语法的一部分。

如果表有 id 字段,一个可行的解决方案是:

DELETE FROM `table` WHERE `id` >= 20 LIMIT 20

但是,它要求我首先找到第 20 个 id 值,并且需要有一个 id 字段。并非我的所有表格都有id 字段。如果表行的顺序不同于id 的升序,它也会给出不同的结果。

我正在尝试找到一个通用的解决方案,因为我正在处理具有多种不同列的表,因此我不能依赖任何特定的列来存在。我的一些表甚至没有主索引。

对于我的特定应用程序,我从表格末尾删除了一些被错误复制的单元格,但我很好奇是否有一个聪明的解决方案也可以从中间删除。

无论如何,我感谢任何帮助或想法!非常感谢!

【问题讨论】:

    标签: mysql syntax limit sql-delete offset


    【解决方案1】:

    您可以使用LIMIT 子查询,如下所示:

    DELETE
    FROM yourTable
    WHERE id IN (SELECT id
                 FROM (SELECT id FROM yourTable ORDER BY id LIMIT 20) t
    );
    

    【讨论】:

    • DELETE 支持单一限制(无偏移)。
    【解决方案2】:
    DELETE t1
    FROM `table` t1
    NATURAL JOIN ( SELECT * 
                   FROM `table` 
                   ORDER BY {expression} LIMIT 20,20 ) t2
    

    没有 ORDER BY 的 LIMIT 没有意义 - 因此添加了带有表达式占位符的 ORDER BY。

    DEMO

    附言。当然,您可以不使用 NATURAL 连接,而是使用带有适当连接表达式的 INNER 连接(例如,通过主键,或者如果它提供行唯一性,则通过排序表达式)。

    【讨论】:

      猜你喜欢
      • 2016-06-18
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多