sql异常及解决方法[Err] 1093 - You can't specify target table 'bbb_copy' for update in FROM clause

详细说明我遇到这个错误的发展

[Err] 1093 - You can't specify target table 'bbb_copy' for update in FROM clause


有一张表 表明    bbb_copy

id    name        score

1 java         70
2 oracle 90
3 xml         40
4 jsp         30
5 servlet 80
6 servlet 80

要求:
删除除了id不同 ,  其他都相同的冗余信息

首先想到的是这个sql语句

用子查询把分组name score相同的列查询到,

delete from bbb_copy where id not in(select min(a.id) id from bbb_copy  a  group by a.name,a.score)


但是报错了

[SQL] delete FROM bbb_copy
 where id not in(select min(a.id) id from bbb_copy  a
group by a.name,a.score)

[Err] 1093 - You can't specify target table 'bbb_copy' for update in FROM clause

我以为自己子表出现了错误,但是一查询,是对的

select min(a.id) id from bbb_copy  a  group by a.name,a.score
id
1
4
2
5
3

然后更改一下第一个sql 看看能不能成功,

delete FROM bbb_copy where id not in(1,4,2,5,3)


成功了,这就另人非常费解了。 因为第一个sql的子查询正确 但是不好使,然后把结果集冲动写在in()中,竟然好使了。


然后上网查询资料

        报错信息如下:

  错误代码: 1093
  You can't specify target table 'sc' for update in FROM clause

        意思是不能同一语句更新select出的同一张表元组的属性值

        解决方法:将select出的结果通过中间表再select一遍即可。


然后自己就按照他的解决方法实验了一下。

delete FROM bbb_copy
 where id not in(select b.* from (select min(a.id) id from bbb_copy  a
group by a.name,a.score) b)

[SQL] delete FROM bbb_copy
 where id not in(select b.* from (select min(a.id) id from bbb_copy  a
group by a.name,a.score) b)

受影响的行: 1
时间: 0.055ms


成功了!!!


总结一下。

    如果在增删改语句中,要使用子查询的形式进行增删改,那么应该把这个子查询进行第二次select一下 才可以执行。

    这个第二次select实际上就是把第一次的select的结果集放在临时表中。


其实想想也是这样的,对同一张表查的同时更新会引起数据不一致的问题吧,但是将查询结果事先放到临时表中就不会有这个问题了


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值