MySQL带有限制条件的删除语句

34

我试图从表格中删除行,但是出现了错误。

DELETE FROM `chat_messages` ORDER BY `timestamp` DESC LIMIT 20, 50;

我在第50行遇到了这个错误:

您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以了解正确的语法使用方法,位于第1行附近 ' 50'

不知道哪里出错了。


请看一下在StackOverflow上也发布的这个问题: https://dev59.com/IG025IYBdhLWcg3wRDu8 - Drew
1个回答

54

你无法在 DELETELIMIT 子句中指定偏移量。

因此,唯一的方法是将查询重写为以下形式:

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

更新:您需要实现双重嵌套来欺骗MySQL,因为它不允许从当前修改的表中进行选择(感谢Martin Smith)


1
MySQL 不允许这样做(错误代码 1093),除非您添加额外的嵌套层级。请参见 https://dev59.com/P0_Sa4cB1Zd3GeqP9iOc。 - Martin Smith
+1 比我先回答了 - DELETE 只接受在 LIMIT 中使用 rowcount - Jason McCreary
@Martin Smith:你是什么意思? - zerkms
1
我编辑了我的评论以添加更多细节。如果子查询直接在IN中,您会收到错误消息“您无法在FROM子句中指定目标表'chat_messages'进行更新”。您可以通过将子查询作为派生表来解决这个问题。 - Martin Smith

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