mysql ignore、replace、on duplicate key update

  1. 场景一:有一张表设置了name字段为唯一索引,在插入的时候,可能插入一条,也可能同时插入几条数据,但是由于name设置了唯一索引,所以如果批量插入的数据有name值重复,就会导致所有的插入失败。如果选择一条一条插入,可以进行判断表中是否已经存在相同的name值,但是消耗数据库资源,性能低。这个时候,可以选择 insert ignore into table (name,other_key) values ('xx', 'yy') ('ss', 'ff') 或者replace into 或者  on duplicate  name  update。具体的用法可以查询手册。ignore会忽略和已存在的记录相同的数据,不插入。replace into  会删除旧的记录,插入新的记录。
  2. 记录一个yii 项目中使用ignore的例子
    1 $table = Nutrient::tableName();  // 表:nutrient,  name是唯一索引,  表中的字段在SQL语句中不需要加引号,待插入的值如果有特殊符号可以使用双引号括起来,使用单引号好像不行会冲突因为mysql会自动给value值加上单引号。这里双引号需要转义
    2             $sql = "INSERT IGNORE INTO {$table} (name, rl, las, gai, dbz, su, mei, zf, ys, tei, shhf, wsfc, meng, ssxw, wsse, xin, wssa, dgc, tong, lb, jia, ling, shc, la, xi, type) VALUES ";
    3 // 待插入的数据有多条,并且可能有的name是数据表已存在的,所以使用ignore关键字。避免数据库报错,导致插入新数据失败。
    4             foreach ($dataFromApi['data'] as $k => $v) {
    5                 // 把 values 的值拼接上,执行一次插入操作,使用model需要多次链接数据库。
    6                 $sql .= "("{$v['name']}",{$v['rl']},{$v['las']},{$v['gai']},{$v['dbz']},{$v['su']},{$v['mei']},{$v['zf']},{$v['ys']},{$v['tei']},{$v['shhf']},{$v['wsfc']},{$v['meng']},{$v['ssxw']},{$v['wsse']},{$v['xin']},{$v['wssa']},{$v['dgc']},{$v['tong']},{$v['lb']},{$v['jia']},{$v['ling']},{$v['shc']},{$v['la']},{$v['xi']},"{$v['type']}"),";
    7             }
    8             $sql = rtrim($sql, ',');
    9             $insert = Yii::$app->db1->createCommand($sql)->execute();
原文地址:https://www.cnblogs.com/bneglect/p/12577579.html