错误代码:1093不能在from子句中为update指定目标表table

xyhw6mcr  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(459)

当我执行下面提到的查询时,它的执行没有任何问题。

delete from table where entryID in
    (
    select * from (select max(entryID) from table where locationId = 2) as deleted
    );

但是,当我试图改变下面相同的查询时,我看到“错误代码:1093。不能在from子句中为update指定目标表table。为什么不接受下面的查询?

delete from table where entryID in
(
select max(entryID) from table where locationId = 2
);
elcex8rz

elcex8rz1#

这是mysql中的一个限制。错误消息很好地说明了限制是什么(这在mysql参考手册中有所记载。)
理解第一个查询不返回错误的原因可能更有意义。为什么这是限制的一个解决方法。这是因为mysql处理它的方式。parens中的查询是一个内联视图,mysql称之为派生表。当我们了解mysql是如何运行的时候,mysql所说的就有意义了。
mysql首先运行内联视图查询,并将结果具体化为一个临时(ish)派生表。
这和做一个 CREATE TEMPORARY TABLE foo ... 和一个 INSERT INTO foo SELECT ... .
在这之后,我们得到一个派生表,然后运行外部查询。外部查询引用派生表。在给出的示例中,派生表被分配别名“deleted”。请注意 FROM 子句正在引用派生表。这就是说,它不涉及的目标 DELETE . 所以它没有违反限制。

lymnna71

lymnna712#

table 是保留关键字(请注意 R 旁边 TABLE ),因此不能用于标识符。
请为表使用其他名称,或将表名封装在反记号中:

delete from `table` where entryID in
(
select max(entryID) from `table` where locationId = 2
);

相关问题