大家好,我是anyux。本文介绍MySQL的字符串替换更新操作。
在贴吧里看到吧友提出问题,还提供红包,看到这些摩拳擦掌,需要解决,就决定在数据库操作一通。
吧友提出的需求如下:
要批量删除数据库表wp_posts的字段post_content中内容为srcset=“XXX”应该怎么搞!srcset=“XXX”都删除,不是只删除这个属性中的内容。
以下是我的解决方案
数据库A中有表B,字段包括id,name,content。数据行数有5条示例创建库、表,并插入数据
createdatabaseAcharsetutf8;
useA;
createtableB(idint, namechar(20),contentvarchar(255));
insertintoBvalues(1,"zs","有朋自远方来,a='b',不亦乐乎"),(2,"ls","人不知而不愠,a='b',不亦君子乎 "),(3,"ww","敬鬼神,a='b',而远之 "),(4,"zl","朝辞白帝彩云间,a='b',千里江陵一日还"),(4,"qb","两岸猿声啼不住,a='b',轻舟已过万重山");
解决思路是
替换a='b'为空,代表删除a='b'
替换语句如下
updateBsetcontent =replace(content,"a='b'",'');
查看表内容
下图中的a='b'已被删除。就在我以为问题解决了时,又看到吧友的回复
吧友回复如下
嗯,顿时感觉自己太年轻了[苦笑]
怎么办,不能楞着,按吧友的规则,创建一些随机字符
第一步:建库、表、插入语句
createdatabaseAcharsetutf8;
useA;
createtableB(idint, namechar(20),contentvarchar(255));
insertintoBvalues(1,"zs","有朋自远方来,a='随机字符&.0fFDc',不亦乐乎"),(2,"ls","人不知而不愠,a='符随机字FEHfd,.*',不亦君子乎 "),(3,"ww","敬鬼神,a='F符随机字EHfd,.*',而远之 "),(4,"zl","朝辞白帝彩云间,a='P)Pfead*#%',千里江陵一日还"),(5,"qb","两岸猿声啼不住,a=' Unix-like、+{{#R',轻舟已过万重山");
第二步:获取数据
获取前半段数据
selectsubstr(content,1,locate('a',content)-1)fromB;
#获取后半段数据
selectsubstr(content,locate('\'',content,locate('\'',content)+1)+1)fromB;
第三步:拼接数据方法1
使用了字符串截取与拼接函数,对每行记录形成一条sql语句,并导出到文件中
selectconcat("update `A`.`B` set content = '",substr(content,1,locate('a',content)-1),substr(content,locate('\'',content,locate('\'',content)+1)+1),"' where id=",id,";")asupdate_sqlfromBintooutfile'/tmp/update.sql';
替换数据
查看sql文件
cat /tmp/update.sql
导入数据,数据已恢复
方法2
使用替换函数replace,拼接函数concat,截取函数substr,自动截取数据,并针对每行记录进行更新操作
这种方法只需要一条语句,就实现整个数据表的更新。推荐这种方式
updateB
setcontent=
replace(content,content,
concat(
substr(content,1,locate('a',content)-1),
substr(content,locate('\'',content,locate('\'',content)+1)+1)
)
);
提示:这里给的方法,只适用于普通的字符,对于表达式中存在多个单引号或双引号,还需要你自己根据业务情况作出判断
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍运维、数据库相关的技术,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章。
领取专属 10元无门槛券
私享最新 技术干货