当我执行下面提到的查询时,它执行没有任何问题。
delete from table where entryID in
(
select * from (select max(entryID) from table where locationId = 2) as deleted
);
但是,当我尝试更改下面的相同查询时,我看到“错误代码:1093。您无法在FROM子句中为更新指定目标表'表'”。为什么不接受以下查询?
delete from table where entryID in
(
select max(entryID) from table where locationId = 2
);
table
是一个reserved keyword(注意R
旁边的TABLE
),所以它不能用于识别。
为表使用不同的名称,或将表名封装在反引号中:
delete from `table` where entryID in
(
select max(entryID) from `table` where locationId = 2
);
这是MySQL的一个限制。错误信息很好地说明了限制是什么。 (这在MySQL参考手册的某处记录。)
理解第一个查询不返回错误的原因可能更有意义。为什么这是限制的解决方法。这是因为MySQL处理它的方式。 parens中的查询是一个内联视图,MySQL调用派生表。当我们理解MySQL如何运作时,MySQL所谓的是有道理的。
MySQL首先运行内联视图查询,并将结果具体化为临时(ish)派生表。
这与做CREATE TEMPORARY TABLE foo ...
和INSERT INTO foo SELECT ...
的效果非常相似。
在那之后,我们有一个派生表,然后外部查询运行。外部查询引用派生表。在给出的示例中,为派生表分配了别名“已删除”。请注意,FROM
子句引用派生表。也就是说,它没有提到DELETE
的目标。所以它没有违反限制。