2016-03-01 48 views
0

我正在嘗試更新名爲位置的表上的4萬條記錄,總共包含6列。 4萬條記錄屬於6個類別中的1個。這些類別是:列「Bin」值以'a','b','c','d','e'或上述任何一個結尾。在MariaDB中優化1次SQL更新聲明

我寫了下面的更新語句,目的是直接在服務器上的表上運行。

UPDATE locations 
SET Division=1, Bin=LEFT(Bin, LENGTH(Bin)-1) 
WHERE RIGHT(Bin, 1)='a'; 

UPDATE locations 
SET Division=2, Bin=LEFT(Bin, LENGTH(Bin)-1) 
WHERE RIGHT(Bin, 1)='b'; 

UPDATE locations 
SET Division=3, Bin=LEFT(Bin, LENGTH(Bin)-1) 
WHERE RIGHT(Bin, 1)='c'; 

UPDATE locations 
SET Division=4, Bin=LEFT(Bin, LENGTH(Bin)-1) 
WHERE RIGHT(Bin, 1)='d'; 

UPDATE locations 
SET Division=5, Bin=LEFT(Bin, LENGTH(Bin)-1) 
WHERE RIGHT(Bin, 1)='e'; 

我從來沒有更新過超過1-5條記錄,我不確定是否有更好的方法來做到這一點。

我可以用PHP編寫一些代碼,所以如果一個解決方案需要整合它,我會接受這個想法。

如果我遺漏了任何相關或需要的信息,請告訴我。感謝您的幫助!

回答

0

只需40K記錄和1斷更新,我不會太擔心的表現,但你可以嘗試一個更新語句: -

UPDATE locations 
SET Division = CASE RIGHT(Bin, 1) 
        WHEN 'a' 
        THEN 1 
        WHEN 'b' 
        THEN 2 
        WHEN 'c' 
        THEN 3 
        WHEN 'd' 
        THEN 4 
        ELSE 5 
       END, 
Bin = LEFT(Bin, LENGTH(Bin)-1) 
WHERE RIGHT(Bin, 1) IN ('a', 'b', 'c', 'd', 'e'); 

可能你一面當前的解決方案是說一個記錄的域值爲'edcba'

您的第一次更新您將Division設置爲1,並將bin設置爲'edcb',但您的下一個UPDATE會將同一行設置爲2的分區和' edc'等

+0

我甚至沒有意識到這個缺陷!非常感謝您指出並解決問題! –

0

(你說表現不是問題,但是這個答案無論如何解決它)

假設bin被索引,那麼這將是一條語句更快。

UPDATE locations 
     SET Division=2, 
     Bin=LEFT(Bin, LENGTH(Bin)-1) 
    WHERE bin LIKE 'b%'; 

如果A,B,C,d,e爲真的連續的,那麼這將使KickStart的查詢運行速度更快 - 替換他的WHERE

WHERE bin >= 'a' 
    AND bin < 'f'