需求,TABLE1 有 A B C 三個欄位,每個欄位可能存在多種值,現在需要將這些值替換掉。
比如這樣:

想把xyz1替換為xyzz1,把xyz2替換為xyzz2,把xyz3替換為xyzz3
現在是程式上,直接把所有資料全部一次查出來,然后根據Where id = ? 這樣挨個替換掉欄位里的值來更新(雖然用了Where id,但實際上全表更新也沒關系)
有不太明白的地方:1 資料量太大,更新時間太長,占用系統資源 2 不清楚會不會帶來其他的隱患
想能不能改直接用SQL就完成這個作業,感覺直接用SQL會比較快,然后不知道該怎么改,請教一下各位大大!
uj5u.com熱心網友回復:
寫幾個update陳述句,用正則運算式匹配更新?uj5u.com熱心網友回復:
copy出來替換最輕松uj5u.com熱心網友回復:
如果PICTURE里的xyz,只會出現一次,那么以下的10個陳述句,可以開10個視窗同時執行。要是還不行,就把MOD(ID,10)改成MOD(ID,100),分100次執行。
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 0 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 1 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 2 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 3 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 4 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 5 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 6 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 7 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 8 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 9 ;
uj5u.com熱心網友回復:
你說的這種,我是不是要根據每個表的資料量來分批次處理?
我用的這種方式:
UPDATE `table1` SET picture = (CASE
WHEN LOCATE("https://xyz1.oss-cn-hangzhou.aliyuncs.com",picture) > 0 THEN REPLACE(picture,"https://xyz1.oss-cn-hangzhou.aliyuncs.com","https://xyz11.oss-cn-hangzhou.aliyuncs.com")
WHEN LOCATE("https://xyz2.oss-cn-hangzhou.aliyuncs.com",picture) > 0 THEN REPLACE(picture,"https://xyz2.oss-cn-hangzhou.aliyuncs.com","https://xyz22.oss-cn-hangzhou.aliyuncs.com")
WHEN LOCATE("https://xyz3.oss-cn-hangzhou.aliyuncs.com",picture) > 0 THEN REPLACE(picture,"https://xyz3.oss-cn-hangzhou.aliyuncs.com","https://xyz33.oss-cn-hangzhou.aliyuncs.com")
ELSE picture
END)
uj5u.com熱心網友回復:
不好意思,我看了一下MOD(numer1,number2),回傳的值為其余數值;
MOD(ID,100)的話,我需要寫100行這樣的SQL去執行,顯得有點麻煩,你這邊開多個視窗可不可以理解為開多個連接?
uj5u.com熱心網友回復:
對,多個視窗,就是多行程。如果只寫一個陳述句,很容易卡死。
這樣分10個行程,執行10次,要比只執行1次,好的多。
如果這樣執行10次,還是卡死不動,就分成100的行程。
但是要是直接開100個視窗,估計也是要卡死的。
辦法是分層100個行程,開10個視窗,每個視窗執行10個。
也就是10個視窗并行,每個視窗里有10個陳述句串行執行。
100個行程的腳本,也很容易。
第一個是這個:
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 0 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 1 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 2 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 3 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 4 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 5 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 6 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 7 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 8 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,10) = 9 ;
第二個,隨意找一個文本編輯器,把上邊的這10條,替換一下,把“MOD(ID,10) = ”替換成“MOD(ID,10) = 1”就可以了。
uj5u.com熱心網友回復:
哦,發錯了,更新一下:100個行程的腳本,也很容易。
第一個是這個:
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,100) = 0 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,100) = 1 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,100) = 2 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,100) = 3 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,100) = 4 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,100) = 5 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,100) = 6 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,100) = 7 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,100) = 8 ;
UPDATE TABLE1 SET PICTURE = REPLACE(PICTURE,'xyz','xyzz') WHERE MOD(ID,100) = 9 ;
第二個,隨意找一個文本編輯器,把上邊的這10條,替換一下,把“MOD(ID,100) = ”替換成“MOD(ID,100) = 1”就可以了。
uj5u.com熱心網友回復:
糾正一下:
SELECT MOD(1099,100)
-> 99
用程式控制也還好,但是如果全部一個連接分批次處理,那么當資料量比較大的時候,我認為應該是,每次鎖的資料越少,對業務造成的影響越小,所以,這個MOD(id,10)的10可以變小,但是分的批次就多了,不過這個可以寫程式來生成SQL;另外一點,程式跑SQL的話,只開啟一次事務的情況,當太多SQL一次提交,會不會提交不上去?另外,如果能提交上,那么在這一個連接里,所有的SQL是排隊執行的還是并行的呢,這樣做,對業務的影響又是怎么樣的呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/202829.html
標籤:MySQL
上一篇:Redis學習五(Redis 阻塞的原因及其排查方向).
下一篇:安裝mysql卡在這里了
