2019-01-04 17:59:16 2558次浏览 7条回答 1 悬赏 300 金钱

如题

Update t_user set name='aa' where id=1
Update t_user set name='bb' where id=2
Update t_user set name='cc' where id=3

类似这种的操作,很多每次大概上万 请问怎么批量修改 循环的就不要了

补充于 2019-01-04 18:11

要修改的值都是一样的

亿速云

最佳答案

  • 刘师傅 发布于 2019-01-05 09:55 举报

    首先你的例子是这样的:

    Update t_user set name='aa' where id=1
    Update t_user set name='bb' where id=2
    Update t_user set name='cc' where id=3
    

    然后你又说“要修改的值都是一样的”,请问,是都修改name字段,但是name字段的值不一样?
    或者是:都修改name,并且值也一样:

    Update t_user set name='aa' where id=1
    Update t_user set name='aa' where id=2
    Update t_user set name='aa' where id=3
    

    如果是第一种情况,Yii2没有,我目前也没见过哪个框架有这个。如果真发现了,你可以分享出来,我们都受益。
    如果是第二种情况,我也得这就好说了。

    tabName::updateAll(['name'=>'aa'],['id'=>['1','2','3']);
    

    从原理来说,我觉得如果真要封装出符合第一种情况更新的方法,肯定得用到循环吧。
    先看看再说吧。

    1 条回复
    回复于 2019-01-05 21:11 回复

    就是第二种情况 在网上有搜到这种,但是还没来得及测试

  • 回答于 2019-01-05 08:12 举报

    D:\website\www\commands\ArtticleController.php

    namespace app\commands;
    use yii\console\Controller;
    class ArticleController extends Controller
    {
    public function actionDelhref()
        {
            echo "删除文章内容中末尾的推荐阅读\n\n";
            $query = (new \yii\mongodb\Query())
                ->select(['title','content'])
                //先用两条测试一下,要不然整个库搞坏了,就要跑路了!
    //            ->where(['in','_id',['5b5822a9b3402a105752ef49','5b595035b3402a613d1670a9']])
                ->from(Article::collectionName());
            $comm = Yii::$app->mongodb->createCommand();
            $i=1;
            $errcount=0;
            $k=0;
            //foreach($query->batch(10) as $infos){ //每批次处理10条记录
            //批处理 默认每批次100条记录
            foreach($query->batch() as $infos){
                $j=1;
                foreach($infos as $info){
                    $content = $info['content'];
                    $content=preg_replace("/推荐阅读:(.*?).html/",'',$content);             
                    $newArr=[
                        'content'=>$content,
                    ];
    //                echo $content;
                    $comm->update(Article::collectionName(),['_id'=>(string)$info['_id']], $newArr);
                    echo $i."-".$j.":".$info['title']." 处理完毕\n";
                    $j++;
                }
                print("\n\n++++++++++++++下一批++++++++++++++++++++\n");
                $i++;
            }
            print("\n\n==============出错数量:".$errcount." ============\n");
    //        print("==============无需处理的记录数量:".$k." ============\n\n");
            return ExitCode::OK;
        }
    

    运行:
    D:\website\www> yii article/delhref

    2 条回复
    回复于 2019-01-05 21:14 回复

    这种的话,如果上万条数据,就应该比较卡了

    回复于 2019-01-06 08:38 回复

    不会卡,我经常拿这个批处理,我的数据正好上万了,这个是mongoDB的,你改一改就可以用。

  • 回答于 2019-01-05 10:56 举报

    一句SQL解决不了的,应该都需要循环来解决吧? 这跟框架无关,是SQL决定的

  • 回答于 2019-01-06 08:17 举报

    如果是第一种情况,可以使用数据库的存储过程或者函数,提升性能

  • 回答于 2019-01-14 16:11 举报

    /**

    • 批量添加
      *
    • @param array $data 要添加的数据的二维数组(要包括所有的字段)
    • @return array $data + _id 组合成的数组
      */
      public static function batchInsert($data){
      return \Yii::$app->mongodb->getCollection(self::collectionName())->batchInsert($data);
      }
  • 回答于 2019-01-15 15:15 举报

    这个只能循环吧!不然分批循环?

  • 回答于 2019-01-18 15:13 举报

    你说的是这种批量修改?
    ``
    UPDATE mytable SET
    myfield = CASE id

        WHEN 1 THEN 'aa'
        WHEN 2 THEN 'bb'
        WHEN 3 THEN 'cc'
    

    END
    WHERE id IN (1,2,3);
    ``

您需要登录后才可以回答。登录 | 立即注册
dada
总监

dada 重庆

注册时间:2017-05-23
最后登录:1天前
在线时长:46小时38分
  • 粉丝0
  • 金钱1905
  • 威望30
  • 积分2665

热门问题