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 有这样奇怪的限制,原因不得而知。可能是为了防止一些意外的更新或冲突,但具体的解释官方并没有给出。