May
16
2017
【原创】记update批量更新及默认值问题
在常规的业务开发过程中,经常有更新数据的情况,而碰到多条数据更新必定会带来多次数据库改写操作,为了增加执行效率和数据完整、一致性,推荐采用多合一的批量更新方法。
首先看一下sql批量更新的语法:
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END WHERE id IN (1,2,3)
如果要对多个字段进行更新则可写如下语法:
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END, title = CASE id WHEN 1 THEN 'New Title 1' WHEN 2 THEN 'New Title 2' WHEN 3 THEN 'New Title 3' END WHERE id IN (1,2,3)
以上便是批量更新的方法了,但是在这里值得注意的是每个条件都要成对出现,哪怕是没有修改的情况!
例如:
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END, title = CASE id WHEN 1 THEN 'New Title 1' /* WHEN 2 THEN 'New Title 2' */ WHEN 3 THEN 'New Title 3' END WHERE id IN (1,2,3)
在例子中,id为2的title我不需要修改,所以我注释掉了,在理论上我们是正确的,但是语句执行后的结果却是将id为2的title变为了''空串。
经过小V的多次调试得出,如果对应修改的字段条件不全写上(也就是只写了修改display_order字段没写title字段或反之)
那缺省的那个值就算没有被赋新值也会被修改为“默认值”,这里的默认值并不是字段中的default,而是这个字段类型的默认值(字符串类型的默认值是空串,数值型的是0,date是0000-00-00,……)。
所以,在使用多字段的批量更新时(单字段批量更新可忽略),应把字段条件都写全,哪怕是该字段并没有修改(要照顾别的有修改的情况)。
如:
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END, title = CASE id WHEN 1 THEN 'New Title 1' WHEN 2 THEN 'New Title 2' WHEN 3 THEN 'New Title 3' END WHERE id IN (1,2,3)
或:
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 /* WHEN 2 THEN 4 */ WHEN 3 THEN 5 END, title = CASE id WHEN 1 THEN 'New Title 1' /* WHEN 2 THEN 'New Title 2' */ WHEN 3 THEN 'New Title 3' END WHERE id IN (1,2,3)
作者:Veris
来源:http://www.mostclan.com/post-211.html
欢迎转载。
发表评论: