设为首页 收藏本站
查看: 295|回复: 0

[经验分享] MySQL 中实现数据的批量修改

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-3-3 08:27:03 | 显示全部楼层 |阅读模式
今天遇到一个数据的批量更新,查了一下官方文档,还好找到了。英文东东,大家耐心哈
http://dev.mysql.com/doc/refman/5.7/en/update.html
一般在使用数据编辑的时候:

1
UPDATE tablename SET field_1='value', field_2='value'[...] WHERE condition_field= 'value'



或者
1
UPDATE tablename SET field_1='value', [field_2...] where condition_field in ('values')




如果更新多条数据为不同的值,怎么做呢?
可能大部分人会这么写:
1
2
3
4
foreach($conditions as $field => $value){
    $sql = "UPDATE tablename SET field = $value WHERE id = $id";
    mysql_query($sql);
}



这样进行一条一条数据进行更新,这样的效率比较低。
有没有一条sql来进行操作的呢?其实mysql并没有提供直接的方法来操作,大家可以看靠一下官方文档,不过是英文的仔细看一下哦
(官方文档:http://dev.mysql.com/doc/refman/5.7/en/update.html)
1
2
3
4
5
6
UPDATE tablename SET
    field = CASE id
        WHERE 1 THEN 'value'
        WHERE 2 THEN 'value'
    END
WHERE id in (1,2,3)



更新多个字段呢?
1
2
3
4
5
6
7
8
9
10
UPDATE tablename SET
    field_1 = CASE id
        WHERE 1 THEN 'value'
        WHERE 2 THEN 'value'
    END,
    field_2 = CASE id
        WHERE 1 THEN 'value',
        WHERE 2 THEN 'value'
    END
WHERE id in (1,2,3)



思路大致就是这样的,如果是PHP那么可以参考一下写的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* 批量更新数据,必须是二位数组
*
* @param array $data 需要跟新的数据
* 比如:$data['字段名称']['主键ID']=>'value'
*
* @return boolean
*/
public function updateAll($data, $dbname) {
    if (empty($data)) {
        return false;
    }
    $sql = "UPDATE ".$dbname." SET ";
    $total = count($data);
    $i = 1;
    $idsArr = array();
    foreach ($data as $field => $val) {
        $sql .= " $field = CASE id ";
        foreach ($val as $id => $v) {
            $sql .= sprintf(" WHEN %d THEN '%s' ", $id, $v);
            if (!in_array($id, $idsArr)) {
                $idsArr[] = $id;
            }
        }

        if ($i == $total) {
            $sql .=" END ";
        } else {
            $sql .=" END, ";
        }
        $i++;
    }
    $ids = implode(',', $idsArr);
    $sql .= " WHERE id IN ($ids)";

    //TODO 具体执行的方法就自己写了( ̄▽ ̄)"
}



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-185547-1-1.html 上篇帖子: MySQL主从同步实验 下篇帖子: mysql 参数调优
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表