大家好,我是anyux。本文介紹MySQL的字符串替換更新操作。
在貼吧裡看到吧友提出問題,還提供紅包,看到這些摩拳擦掌,需要解決,就決定在數據庫操作一通。
吧友提出的需求如下:
要批量刪除數據庫表wp_posts的字段post_content中內容為srcset=“XXX”應該怎麼搞!srcset=“XXX”都刪除,不是隻刪除這個屬性中的內容。
以下是我的解決方案
數據庫A中有表B,字段包括id,name,content。數據行數有5條示例創建庫、表,並插入數據
<code> create database A charset utf8;
use A;
create table B(id int, name char(20),content varchar(255));
insert into B values(1,"zs","有朋自遠方來,a='b',不亦樂乎"),(2,"ls","人不知而不慍,a='b',不亦君子乎 "),(3,"ww","敬鬼神,a='b',而遠之 "),(4,"zl","朝辭白帝彩雲間,a='b',千里江陵一日還"),(4,"qb","兩岸猿聲啼不住,a='b',輕舟已過萬重山");/<code>
解決思路是
替換a='b'為空,代表刪除a='b'
替換語句如下
<code> update B set content = replace(content,"a='b'",''); /<code>
查看錶內容
下圖中的a='b'已被刪除。就在我以為問題解決了時,又看到吧友的回覆
吧友回覆如下
嗯,頓時感覺自己太年輕了[苦笑]
怎麼辦,不能楞著,按吧友的規則,創建一些隨機字符
第一步:建庫、表、插入語句
<code> create database A charset utf8;
use A;
create table B(id int, name char(20),content varchar(255));
insert into B values(1,"zs","有朋自遠方來,a='隨機字符&.0fFDc',不亦樂乎"),(2,"ls","人不知而不慍,a='符隨機字FEHfd,.*',不亦君子乎 "),(3,"ww","敬鬼神,a='F符隨機字EHfd,.*',而遠之 "),(4,"zl","朝辭白帝彩雲間,a='P)Pfead*#%',千里江陵一日還"),(5,"qb","兩岸猿聲啼不住,a=' Unix-like、+{{#R',輕舟已過萬重山");/<code>
第二步:獲取數據
<code> 獲取前半段數據
select substr(content,1,locate('a',content)-1) from B;/<code>
<code> #獲取後半段數據
select substr(content,locate('\\'',content,locate('\\'',content)+1)+1) from B;/<code>
第三步:拼接數據方法1
使用了字符串截取與拼接函數,對每行記錄形成一條sql語句,並導出到文件中
<code> select concat("update `A`.`B` set content = '",substr(content,1,locate('a',content)-1),substr(content,locate('\\'',content,locate('\\'',content)+1)+1),"' where id=",id,";") as update_sql from B into outfile '/tmp/update.sql';/<code>
替換數據
查看sql文件
<code> cat /tmp/update.sql/<code>
導入數據,數據已恢復
方法2
使用替換函數replace,拼接函數concat,截取函數substr,自動截取數據,並針對每行記錄進行更新操作
這種方法只需要一條語句,就實現整個數據表的更新。推薦這種方式
<code> update B
set content=
replace(content,content,
concat(
substr(content,1,locate('a',content)-1),
substr(content,locate('\\'',content,locate('\\'',content)+1)+1)
)
); /<code>
提示:這裡給的方法,只適用於普通的字符,對於表達式中存在多個單引號或雙引號,還需要你自己根據業務情況作出判斷
歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹運維、數據庫相關的技術,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章。
閱讀更多 anyux1 的文章