更新數據庫中值爲拼接字符串的字段

咱們開發系統涉及權限的時候,會處理到用戶和角色的關係app

一般狀況下,咱們會建一個用戶角色關係映射表:user_role_mappingspa

字段有id,user_id,role_idcode

若是某個用戶有多個角色,那麼在user_role_mapping表中是有多條記錄的blog

也有特殊的處理方式開發

在用戶表user中新建一個字段role_ids記錄字符串

若是某個用戶有多個角色,那麼在role_ids記錄的值是 1,2,多個角色用逗號分隔class

添加新的角色權限

那咱們批量給用戶(某個組織下的用戶)添加新的角色的時候該如何處理呢?map

簡單來講分爲三種狀況:im

1.若是用戶已經存在新增的角色,這個時候是不須要修改的,咱們保持這一批用戶權限不變

2.若是用戶從未設置過角色(null),或者角色字段爲空,咱們直接給這一批用戶添加權限:set role_ids = 新role_id

3.若是用戶設置過多種角色(注意要排除包含新角色的狀況),好比上圖用戶666666的角色有9和10,咱們在給他添加角色11,最新的role_ids的值是9,10,11,咱們須要 set role_ids = concat(role_id,'',' 新role_id')便可

綜上所訴語句以下

UPDATE user set role_ids = 新role_id WHERE dept_id IN ('deptid1','deptid2') AND (role_ids  = '' OR role_ids is null);
UPDATE user set role_ids = 新role_id WHERE dept_id IN ('deptid1','deptid2') AND LENGTH(role_ids ) > 0 AND LOCATE(新role_id,role_ids ) = 0;
解釋 LOCATE(新role_id,role_ids ) = 0 

返回字段 role_ids 中字符串 新role_id 第一次出現的位置,此處值爲0,找不到,表示用戶的多個角色並不包含新的角色

批量修改的時候須要執行以上兩條語句。


刪除角色

咱們處理了添加新角色操做,接下來處理刪除角色。看明白的同窗,應該知道,咱們操做的條件核心是定位字符串位置,操做字符串。
刪除的狀況分析以下:
1.若是用戶包含一個角色,直接置空便可。

2.若是用戶包含多個角色,且刪除的角色出如今最後的位置,須要替換 ',role_id' 爲空

3.若是用戶包含多個角色,且刪除的角色出如今中間的位置的位置,須要替換 ',role_id' 爲空
4.若是用戶包含多個角色,且刪除的角色出如今第一位,須要替換 'role_id,' 爲空

   綜上所訴:狀況2和狀況3,操做一致,咱們能夠當作一種狀況處理

  整理語句以下:

       

UPDATE user set role_ids =  REPLACE(role_ids,'刪除的role_id','') WHERE role_ids = '刪除的role_id';
UPDATE ser set role_ids = REPLACE(role_ids,CONCAT(',','刪除的role_id'),'') WHERE LOCATE(CONCAT(',','刪除的role_id',','),role_ids) > 1 
OR (LOCATE(CONCAT(
',','刪除的role_id),role_ids) = LENGTH(role_ids) - LENGTH('刪除的role_id') AND LENGTH(role_ids) > LENGTH(CONCAT(',','刪除的role_id)))
UPDATE user set role_ids = REPLACE(role_ids,CONCAT('刪除的role_id',','),'') WHERE LOCATE(CONCAT('刪除的role_id',','),role_ids) = 1
 
解釋 LOCATE(CONCAT('刪除的role_id',','),role_ids) = 1

CONCAT('刪除的role_id',',') 字符串拼接 好比 CONCAT('9',',') 結果是字符串:9,
LOCATE('9,',role_ids) = 1 確保要刪除角色是在角色字符串第一位
LOCATE(',9,',role_ids) > 1 確保要刪除角色是在角色字符串中間的位置
LOCATE(',9',role_ids) = LENGTH(role_ids) - LENGTH('9') AND LENGTH(role_ids) > LENGTH(',9') 確保要刪除角色是在角色字符串最後的位置
相關文章
相關標籤/搜索