错误代码: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 BY
和 LIMIT
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 查询分配别名。
所以我们必须将它放在另一个查询中,我想它将它与更新语句分开。
假设我有 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 BY
和 LIMIT
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 查询分配别名。 所以我们必须将它放在另一个查询中,我想它将它与更新语句分开。