mysql常见问题--target table for update in FROM clause

最近接触到一个项目,需要对地区表进行操作,其需求就是:将市级地区和县级地区的地区名中的“市”“县”去除。比如“上海市”–>“上海”。在数据表中地区用一个字段表示dis_name.
首先想到的是用sql中replace函数:

update district set dis_name=replace(dis_name,'市',' ');

但这样的方式显得有点太粗糙了,如果在一些特殊的市级地区中也还有“市”字,如”历市镇”这样的镇级地区名会产生错误,所以没有用这种方式。
于是想用字符串截取的方式进行更新,主要是对市级地区最后一个“市”字进行删除即可。于是写出以下的sql语句

  update district 
      set dis_name = SUBSTR(dis_name,1,LENGTH(dis_name)/3-1) 
      where  district.dis_id 
      in (select dis_id from district 
                        where dis_level!=1 and SUBSTR(dis_name,-1,1)='市') 

问题出现:You can’t specify target table ‘district’ for update in FROM clause
从字面上看:MySQL不能指定更新的目标表在FROM子句。即:不能先select出同一表中的某些值,再update这个表(在同一语句中)
解决方案:将select出的结果再通过中间表select一遍,这样就规避了错误。即:先把要更新的目标放到一张临时表再把要删除的条件指定到这张临时表即可。
由上,写出如下

update district 
    set dis_name = SUBSTR(dis_name,1,LENGTH(dis_name)/3-1) 
    where district.dis_id in 
        (select a.dis_id from 
               (select dis_id from district 
                       where dis_level!=1 and SUBSTR(dis_name,-1,1)='市') as a)

问题解决!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值