错误代码:1093。您无法指定目标表'表'用于FROM子句中的更新

时间:2018-06-06 02:17:58

标签: mysql

当我执行下面提到的查询时,它会毫无问题地执行。

 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
);

2 个答案:

答案 0 :(得分:0)

tablereserved keyword(请注意R旁边的TABLE),因此不能用于标识。
使用其他名称你的表,或用反引号封装你的表名:

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

答案 1 :(得分:0)

这是MySQL的限制。错误信息很好地说明了限制是什么。 (这在MySQL参考手册的某处有记载。)

理解第一个查询不返回错误的原因可能更有意义。为什么这是限制的解决方法。这是因为MySQL处理它的方式。 parens中的查询是内联视图,MySQL调用派生表。当我们理解MySQL如何运作时,MySQL所谓的是有道理的。

MySQL首先运行内联视图查询,并将结果具体化为临时(ish)派生表

这与执行CREATE TEMPORARY TABLE foo ...INSERT INTO foo SELECT ...的效果非常相似。

之后全部平方,我们有一个派生表,然后运行外部查询。外部查询引用派生表。在给出的示例中,为派生表分配了别名“已删除”。请注意,FROM子句引用了派生表。也就是说,它没有引用DELETE的目标。所以它没有违反限制。