当前位置: 首页 > 知识库问答 >
问题:

mysql - 为啥sql的疑问包了一层就成功了?

曹均
2023-07-08

我有个sql的疑问,如下:

delete  FROM sys_post WHERE post_id  NOT IN (
    SELECT MIN(post_id) AS min_id FROM sys_post GROUP BY post_name 
);

上边这个语句会报错;(SQL 错误 [1093] [HY000]: You can't specify target table 'sys_post' for update in FROM clause);

delete FROM sys_post WHERE post_id  NOT IN (
  **SELECT t.min_id FROM (**
    SELECT MIN(post_id) AS min_id FROM sys_post GROUP BY post_name 
  **) t**
);

这个就好着呢;

疑问:第二个语句只不过加了一层包裹,为啥就执行成功了???谢谢

共有1个答案

燕俊明
2023-07-08

MySql 设计如此,INSERT/UPDATE/DELETE 之类的更新语句要更新的表,和其子查询 FROM 的表,不能是同一张表。

但只有 MySql 有这个问题,其他主流数据库(比如 Oracle、SQL-Server)都没有这种约束。

官方对此的解释只有这一句话:

REF: https://dev.mysql.com/doc/refman/8.0/en/update.html

You cannot update a table and select directly from the same table in a subquery.

紧接着这句话官方给出的解决方案就是:

You can work around this by using a multi-table update in which one of the tables is derived from the table that you actually wish to update, and referring to the derived table using an alias.

也就是你这里的用个中间表起个别名包裹一下就好了。

至于为啥有这种蛋疼的约束,天知道。

 类似资料:
  • 现在遇到个这么个需求,就是项目用的vite的打包工具 我现在想实现把项目用vite打包, 然后把项目中的其中一两个组件也单独打包成一个js,类似于把其中一两个组件打包成组件库的js 也就是执行npm run build的时候既打包了项目,又打包了其中部分组件为组件库的js,供外部html直接引入这个打包好的js进行使用,这个有办法实现吗

  • oracle、sql server 预设锁不同行为疑问 为何 oracle 预设更新锁行不排他,其他session还能继续更新,只是排队 sql server 预设更新所行排他,其他session更新会报错 请问是什么设计逻辑导致差异吗?

  • 问题内容: 我正在尝试微调MySQL服务器,以便检查设置,分析慢速查询日志并在可能的情况下简化查询。 有时,如果我正确地建立索引就足够了,有时却不行。我读过某个地方(如果这是愚蠢的话,请纠正我的意思),比我需要的索引更多,可以达到相同的效果,就像我没有任何索引一样。 多少个索引足够?您可以说这取决于数百个因素,但是我很好奇如何清理自己的内容以减轻服务器负载。 此外,我看到了一些“有趣的”日志条目,

  • 问题内容: 我有一个基本的实体树结构。该树最多可以有5个节点深,但可以有N个节点宽。我已将这种关系映射到类似于以下所示的表中: 我从一个已知的对象开始,这可以转换为具有起始的“ myID”。现在,我想获取所有子节点。有没有一种方法可以在一条语句中获得所有子节点?这需要包括我的孩子们的孩子,然后沿着树走下去。我正在使用Oracle SQL。 谢谢,周杰伦 问题答案:

  • 有人在使用IntelliJ的JDK16(https://JDK.java.net/16/)早期访问构建时取得过成功吗? 我能够使用JDK15早期访问构建,但是当我尝试JDK16时,我得到一个错误消息: 我所做的所有研究都表明JDK将tools.jar存储在path/to/jdk-16/lib文件夹中。问题是,JDK15包中也没有tools.jar,但是JDK15工作得很好。 如果有人有任何线索,如

  • PostgreSQL 官方文档关于部分索引给了以下一个示例: Example 11.2. Setting up a Partial Index to Exclude Uninteresting Values If you have a table that contains both billed and unbilled orders, where the unbilled orders tak