【原创】记update批量更新及默认值问题

作者Veris 文章分类 分类:MySQL 文章评论 0条评论 阅读次数 已被围观 555

在常规的业务开发过程中,经常有更新数据的情况,而碰到多条数据更新必定会带来多次数据库改写操作,为了增加执行效率和数据完整、一致性,推荐采用多合一的批量更新方法。

首先看一下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

欢迎转载。

分类:MySQL
标签: update

发表评论: