2016-03-01 20 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'