注册 登录
  • 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

MySQL SQL报错解决:You can’t specify target table ‘work’ for update in FROM clause

MySQL FAQ 彭东稳 5055次浏览 已收录 0个评论

下面来对GROUP BY后面有多个字段进行测试。

一、环境搭建

插入参数

二、使用场景

1、查询每个人换了多少次工作。

2、查询每个人在同一地点换了多少次工作。

3、查询每个人在同一地点换了多少次工作,然后显示出大于1次的地点。

4、查询每个人在同一地点换了多少次工作,然后显示出大于1次的地点,并查找出对应最新的插入记录(id较大的)。

5、删除最新插入记录(查询每个人在同一地点换了多少次工作,然后显示出大于1次的地点,并查找出对应最新的插入记录(id较大的))。

刚开始按照自己的逻辑就这样写了一条删除语句,执行的时候报错了,有点懵逼了。后来查了文章,说不能先select出同一表中的某些值,再delete/update这个表(在同一语句中)。不知道MySQL为什么不允许这样操作,猜,可能是担心更新的表与查询的表为同一表会存在嵌套递归?还是担心效率的问题呢?这个问题只出现于MySQL,Ms SQL和Oracle不会出现此问题。

其实嵌套一下就OK了,后来改写成下面这样就行了:

三、嵌套错误写法导致全表操作

但是上面这个写法是标准写法,如果说你在写SQL时写成下面这种,那么就会导致全表更新或全表删除了,一定要注意哦。

按道理说这个语句应该是不被允许执行的,MySQL应该报错,反而把全表给操作了,演示如下:

然后执行,查看结果。

悲剧就此产生,等着恢复数据吧。

当然你也可以把下面这种写法:

改成

都是正确的。

完结。。。


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (1)or分享 (0)
关于作者:

您必须 登录 才能发表评论!