MySQL实现find_in_set类型字段更新删除某项,函数实现
在MySQL中偶尔要用到A表1条记录绑定B表的多个记录的情况,如果新增个C表来存储A_id,B_id这样的话确实有时候会增加大量的表,删除A记录的时候也要麻烦些。所以有些时候我们直接用1,2,3,,..这种类型的数据来记录关联关系。
例如文章表需要关联多个Tag标签方便搜索,那么可以在文章表添加字段tag_ids的文本字段,tag查询的时候直接find_in_set()进行查询,那么如果后台删除了某个tag,此时要更新tag_ids字段,就需要用到下面的函数了
#字段格式:1,2,3,4,5 , 调用该函数可以删除其中某个值 #需要有权限 set global log_bin_trust_function_creators=TRUE; delimiter $$ ##将分号自动提交改成$$ drop function if EXISTS sev_setfield_delete; create FUNCTION sev_setfield_delete(field varchar(255),zhi VARCHAR(30)) RETURNS varchar(255) CHARSET utf8 BEGIN DECLARE fieldNew varchar(255); #为空判断 if isnull(field) || length(trim(field)) = 0 then set fieldNew = ''; else #加首尾 set fieldNew = concat(',',field,','); #替换 set fieldNew = REPLACE(fieldNew, concat(',',zhi,','),','); #去首尾 set fieldNew = substring(fieldNew,2,length(fieldNew)-2); end if; RETURN fieldNew; END $$ delimiter ;
可以通过cmd用root用户登录后切换到目标数据库再执行上面的代码,
此后,要删除文章表的某个tag_id就用set tag_ids = sev_setfield_delete(tag_ids ,'5')来删除tag_id=5的选项。