Hello! 欢迎来到小浪云!


在 MySQL 中,为什么不能在子查询的 from 子句中更新当前查询的表?


avatar
小浪云 2024-11-09 65

在 MySQL 中,为什么不能在子查询的 from 子句中更新当前查询的表?

sql 查询表内不重复记录的神秘包裹

在执行 SQL 查询语句时,你可能会遇到这样的错误:”SQL 错误 [1093] [HY000]: You can’t specify target table ‘sys_post’ for update in FROM clause”。这通常是因为你试图在一个子查询的 from 子句中更新当前正在查询的表。

然而,如果在子查询周围添加一层包裹,即使用一个派生表并通过别名引用该表,查询就能成功执行。

mysql 的特殊性

这种行为是 MySQL 特有的。其他大型数据库管理系统,如 oracle 和 SQL Server,没有这样的限制。

官方解释

MySQL 官方唯一对这一行为的解释是:”You cannot update a table and select directly from the same table in a subquery.”(你不能更新一个表并在一个子查询中直接从同一张表中选择。)

解决方案

官方提供的解决方案是使用多表更新,其中一个表派生自你实际上希望更新的表,并使用别名引用派生表。

原因猜测

至于为什么 MySQL 有这样奇怪的限制,原因不得而知。可能是为了防止一些意外的更新或冲突,但具体的解释官方并没有给出。

相关阅读