1. 報錯:You can't specify target table 'TS_AUTH_ADMIN' for update in FROM clause,
百度查到說是,不能在同一語句中先select出同一表中的某些值,再update這個表 。
我原本的sql是:(刪除角色的時候,把管理員擁有的該角色信息也刪除)
update TS_AUTH_ADMIN set ROLE_IDS =CASE WHEN ROLE_IDS in (select ROLE_IDS FROM TS_AUTH_ADMIN WHERE instr(ROLE_IDS,#{roleId}+',')>0) THEN replace(ROLE_IDS,#{id}+',','') WHEN ROLE_IDS in (select ROLE_IDS FROM TS_AUTH_ADMIN WHERE instr(ROLE_IDS,#{roleId})>0) THEN replace(ROLE_IDS,#{id},'') ELSE ROLE_IDS END和:update TS_AUTH_ADMIN set ROLE_NAME =CASE WHEN ROLE_NAME in (select ROLE_NAME FROM TS_AUTH_ADMIN WHERE instr(ROLE_NAME,#{roleName}+',')>0) THEN replace(ROLE_NAME,#{roleName}+',','') WHEN ROLE_NAME in (select ROLE_NAME FROM TS_AUTH_ADMIN WHERE instr(ROLE_NAME,#{roleName})>0) THEN replace(ROLE_NAME,#{roleName},'') ELSE ROLE_NAME END
2. ? 后來我改成類似如下寫法:
update TS_AUTH_ADMIN set ROLE_NAME =(CASE WHEN instr(ROLE_NAME,'test2,')>0THEN replace(ROLE_NAME,'test2,','') WHEN instr(ROLE_NAME,'test2')>0THEN replace(ROLE_NAME,'test2','') ELSE ROLE_NAME END),ROLE_IDS =(CASE WHEN instr(ROLE_IDS,'6,')>0THEN replace(ROLE_IDS,'6,','') WHEN instr(ROLE_IDS,'6')>0THEN replace(ROLE_IDS,'6','') ELSE ROLE_IDS END)
測試通過:(當然我這樣改,沒有重現問題,不算解決,只是對我的業務是可用的)
3. ? 網上說再加一層查詢可以解決:
修改成在select外邊套一層,讓數據庫認為你不是查的同一表的數據 這個方法參考:http://blog.csdn.net/yhl_jxy/article/details/50856619