DELETE语句中的MySQL LIMIT

时间:2011-05-24 14:25:28

标签: mysql limit sql-delete

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

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

我放在一起的表叫做 test ;它有3列, id name created 。我用几个记录填充了表,然后尝试删除一个。以下是我过去尝试完成此任务的陈述。

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

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

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

然而,我的问题集中于为什么第一个陈述不适用于LIMIT。

所以我的问题是,关于生成此错误的第一个语句,我做错了什么?

7 个答案:

答案 0 :(得分:31)

只需使用

DELETE FROM test WHERE 1= 1 LIMIT 10 

答案 1 :(得分:20)

删除查询只允许在DELETE'命令'后面的修饰符告诉数据库处理事情的方式/方法。

请参阅this page

答案 2 :(得分:6)

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

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

答案 3 :(得分:1)

使用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

答案 4 :(得分:0)

来自the documentation

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

答案 5 :(得分:0)

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

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

由于LIMIT位于派生表中,因此联接将仅匹配1行,因此查询将仅删除该行。

答案 6 :(得分:-1)

首先,我在  从...中删除,使用...在哪里查询,... 因为我想先测试 所以我尝试了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

这行得通。