删除语句的MySQL限制

删除语句的MySQL限制,mysql,limit,sql-delete,Mysql,Limit,Sql Delete,我为最近遇到的一个错误整理了一个测试表。它涉及在试图从MySQL表中删除单个记录时使用LIMIT 我所说的错误是“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在第1行“LIMIT 1”附近使用的正确语法。” 我放在一起的表格叫做test;它有3列,id、name和created。我用几条记录填充了表,然后试图删除一条记录。下面是我用来尝试和实现这一点的陈述 从测试t中删除t,其中t.name='foo'限制1 如果不使用limit1,语句的执行就很好,但是如果没有必要

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

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

我放在一起的表格叫做test;它有3列,id、name和created。我用几条记录填充了表,然后试图删除一条记录。下面是我用来尝试和实现这一点的陈述

从测试t中删除t,其中t.name='foo'限制1

如果不使用limit1,语句的执行就很好,但是如果没有必要,我当然不会使用LIMIT

我完全知道我可以使用另一条语句成功完成此删除。见下文:
从测试中删除,其中name='foo'限制1

然而,我的问题集中在为什么第一个语句没有限制


所以我的问题是,我对第一个产生这个错误的语句做了什么错误的处理

delete查询只允许delete“命令”后的修饰符告诉数据库什么/如何处理事情

请参见

简单使用

DELETE FROM test WHERE 1= 1 LIMIT 10 

使用
row\u count-所需的偏移量

如果我们有10行,想要偏移3

 10 - 3 = 7
现在,查询
delete from table,其中this=订单asc limit 7
保留最后3个,而
order desc
保留前3个:

$row_count - $offset = $limit

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

@安德烈:如果我理解你的要求,我想我唯一缺少的就是t.*在
之前,我先和一个 从…中删除。。。使用。。。其中查询,。。。 因为我想先测试一下 所以我试着选择从。。。使用。。。哪里 这导致了一个错误。。。 然后我想通过添加
限制10 这也产生了一个错误 然后我取消了“限制”,万岁了,它成功了: “删除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
这起作用了。

来自:


通过使用派生表可以解决此问题

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

由于限制位于派生表内,因此联接将只匹配一行,因此查询将只删除此行。

“但是,在多表删除中不能使用ORDER BY或LIMIT”。这似乎回答了我的问题。是的-对不起,我没有从OP中读到这一点,但您关于从联接中删除的说法是正确的OP明确表示他知道这是有效的…”“我完全知道我可以使用另一条语句成功完成此删除。[…]
DELETE from test WHERE name='foo'LIMIT 1
”我不能使用
delete from
,因为我需要加入数据。为什么使用where 1=1?我对你的答案投了反对票,因为它不是关于实际主题的答案。请看上面的问题。
You cannot use ORDER BY or LIMIT in a multiple-table DELETE.
DELETE t1 FROM test t1 JOIN (SELECT t.id FROM test LIMIT 1) t2 ON t1.id = t2.id