我正在尝试在名为locations的表上更新大约4万条记录,共有6列。 4万条记录属于6类中的1类。类别是:Column" Bin"价值结束于''''' c'' d',' e'或者没有上述的。
我编写了以下Update语句,目的是直接在服务器上的表上运行。
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 :(得分: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'等的bin
答案 1 :(得分: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'