错误代码:1093。您不能在 FROM 子句中为更新指定目标 table

Error Code: 1093. You can't specify target table for update in FROM clause

假设我有 table 个产品并且只有 2 个字段; ID 和 purchase_date。我想删除 2019 年购买的最后一个产品。 我尝试使用以下查询来做到这一点:

DELETE FROM products
WHERE id = (SELECT id
            FROM products
            WHERE purchase_date LIKE '2019%'
            ORDER BY purchase_date DESC
            LIMIT 1);

不幸的是,出现了标题中所写的错误。我知道此错误是已知错误,我已尝试寻找解决方案。我查看了 here and here,但是,我不明白如何更改我的查询以使其正常工作。

我很乐意提供帮助和解释。提前致谢。

MySql 对于也在 sub-query.

中使用目标 table 的更新或删除语句感到尴尬

但是您不需要 sub-query 来使用 ORDER BYLIMIT

DELETE FROM products
WHERE YEAR(purchase_date) = 2019
ORDER BY purchase_date DESC
LIMIT 1;

db<>fiddle here

或搜索方式

DELETE FROM products
WHERE purchase_date >= '2019-01-01'
  AND purchase_date  < '2020-01-01'
ORDER BY purchase_date DESC
LIMIT 1;

是否仍要使用查询? 然后傻MySql。 通过从查询或 CTE 中选择。

WITH CTE_DELETE AS
(
  SELECT id 
  FROM products 
  WHERE YEAR(purchase_date) = 2019
  ORDER BY purchase_date DESC
  LIMIT 1
)
DELETE FROM products t
WHERE id IN (SELECT id FROM CTE_DELETE);
DELETE FROM products t
WHERE id IN (SELECT id FROM (
  SELECT id 
  FROM products 
  WHERE YEAR(purchase_date) = 2019
  ORDER BY purchase_date DESC
  LIMIT 1
)d);

试试这个

DELETE FROM products
WHERE id = (SELECT * FROM
            (SELECT id 
            FROM products
            WHERE purchase_date LIKE '2019%'
            ORDER BY purchase_date DESC
            LIMIT 1)tblTmp);

查询基本相同,只是内部 select 被包裹在另一个 select 中。 最重要的是要注意原来的 select 已经被赋予了别名“tblTmp”。 (名称 tblTmp 是任意的,您可以给它任何别名。) 别名很重要,因为分配别名会告诉 MySQL 从这个 select 查询创建一个临时的 table。 临时 table 然后可以用作更新语句的源标准。 它被包装在另一个查询中的原因是因为 MySQL 语法不允许您在更新语句的一部分时为 select 查询分配别名。 所以我们必须将它放在另一个查询中,我想它将它与更新语句分开。