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的选项。