【问题标题】:MySQL LIMIT on DELETE statement删除语句上的 MySQL LIMIT
【发布时间】:2011-09-01 00:03:29
【问题描述】:

我为最近遇到的一个错误整理了一个测试表。它涉及在尝试从 MySQL 表中删除单个记录时使用 LIMIT。

我所说的错误是“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'LIMIT 1' 附近使用正确的语法 "

我放在一起的表叫做test;它有 3 列,idnamecreated。我用几条记录填充了表格,然后尝试删除一条。以下是我用来尝试完成此操作的语句。

DELETE t FROM test t WHERE t.name = 'foo' LIMIT 1

如果不使用 LIMIT 1,语句执行得很好,但如果不需要,我当然不会使用 LIMIT。

我完全清楚我可以使用另一个语句来成功完成此 DELETE。见下文: DELETE FROM test WHERE name = 'foo' LIMIT 1

但是我的问题集中在为什么第一个语句不适用于 LIMIT。

所以我的问题是,关于第一条语句我做错了什么来产生这个错误?

【问题讨论】:

    标签: mysql limit sql-delete


    【解决方案1】:

    简单地使用

    DELETE FROM test WHERE 1= 1 LIMIT 10 
    

    【讨论】:

    • OP 明确表示他知道这是有效的......“我完全知道我可以使用另一个语句来成功完成这个 DELETE。[...] DELETE FROM test WHERE name = 'foo' LIMIT 1
    • 我不能使用delete from,因为我需要加入数据
    • 为什么使用 where 1 = 1 ?
    【解决方案2】:

    delete 查询只允许在 DELETE 'command' 之后使用修饰符来告诉数据库什么/如何处理。

    this page

    【讨论】:

    • “但是,您不能在多表 DELETE 中使用 ORDER BY 或 LIMIT”。这似乎回答了我的问题。
    • 是的 - 抱歉没有从 OP 中读到,但你所说的从加入中删除是正确的
    【解决方案3】:
    DELETE t.* FROM test t WHERE t.name = 'foo' LIMIT 1
    

    @Andre 如果我明白你在问什么,我认为唯一缺少的是FROM 之前的 t.*。

    【讨论】:

      【解决方案4】:

      来自the documentation

      You cannot use ORDER BY or LIMIT in a multiple-table DELETE.
      

      【讨论】:

        【解决方案5】:

        使用row_count - your_desired_offset

        所以如果我们有 10 行并且想要偏移 3

         10 - 3 = 7
        

        现在查询 delete from table where this = that order asc limit 7 保留最后 3 个,order desc 保留前 3 个:

        $row_count - $offset = $limit
        
        Delete from table where entry = criteria order by ts asc limit $limit
        

        【讨论】:

          【解决方案6】:

          有一种解决方法可以通过使用派生表来解决此问题。

          DELETE t1 FROM test t1 JOIN (SELECT t.id FROM test LIMIT 1) t2 ON t1.id = t2.id
          

          因为 LIMIT 在派生表内,所以连接将只匹配 1 行,因此查询将只删除这一行。

          【讨论】:

            【解决方案7】:

            首先我有点挣扎 DELETE FROM ... USING ... WHERE 查询,... 因为我想先测试 所以我尝试使用 SELECT FROM ... USING... WHERE ... 这导致了一个错误,... 然后我想减少删除添加的数量
            限制 10 这也产生了错误 然后我删除了“LIMIT”并且 - 欢呼 - 它起作用了: "已删除 1867 行。(查询耗时 1.3025 秒。)"

            查询是:

            DELETE FROM tableX 
            USING tableX , tableX as Dup 
            WHERE NOT tableX .id = Dup.id 
             AND tableX .id > Dup.id 
             AND tableX .email= Dup.email 
             AND tableX .mobil = Dup.mobil
            

            这行得通。

            【讨论】:

            • 我对您的答案投了反对票,因为这不是关于实际主题的答案。请看上面的问题。
            猜你喜欢
            • 1970-01-01
            • 2010-12-31
            • 1970-01-01
            • 2013-04-02
            • 2011-10-31
            • 1970-01-01
            • 2023-04-04
            • 2019-12-21
            • 1970-01-01
            相关资源
            最近更新 更多