Yii2的bacthInsert以及MySQL中的INSERT IGNORE INTO 批量

  •   
  • 10741
  • PHP
  • 43
  • super_dodo
  • 2016/12/28

之前写了一篇Yii2批量插入的方法,现在处理一下再批量插入过程中出现重复主键等的报错的机制。Yii2的batchInsert中batchInsert($table, $columns, $rows);只接收3个参数,没有ignore这个参数。所以也就没有在批量插入的时候有忽略跳过错误的方法。也就是其中一条语句报错,则该执行全部不执行,和mysql的执行语句保持一致。下面看代码。(假设我需要对用户打标签,并且有个要求,同一个用户不能重复打同一个标签)

/**
* mysql表的语句--两个主键--不给同一个用户打同一个标签
DROP TABLE IF EXISTS `dodo_tag`;
CREATE TABLE `dodo_tag` (
`user_id` int(11) NOT NULL,
`tag_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4mb4;
 *
 */

$table = 'dodo_tag';             //数据表
$field = ['user_id','tag_id'];      //插入的字段
$batchData[] = [1,1];
$batchData[] = [1,2];
$batchData[] = [1,1];           //此处和前面有重复
$batchData[] = [1,4];
$batchData[] = [1,5];

$rt = Yii::$app->db->createCommand()->batchInsert($table,$field,$batchData)->execute();
var_dump($rt);

//报错如下---查看结果--没有任何一条记录
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-1' for key 'PRIMARY'\nThe SQL being executed was: INSERT INTO `dodo_tag` (`user_id`, `tag_id`) VALUES (1, 1), (1, 2), (1, 1), (1, 4), (1, 5)


INSERT INTO dodo_tag (user_id,tag_id) VALUES (1,1),(1,2),(1,1),(1,4),(1,5);
//报错如下--查看结果--没有任何一条记录执行成功--其中一条报错--则全部不执行
[SQL] INSERT INTO dodo_tag (user_id,tag_id) VALUES (1,1),(1,2),(1,1),(1,4),(1,5);
[Err] 1062 - Duplicate entry '1-1' for key 'PRIMARY'



INSERT IGNORE INTO dodo_tag (user_id,tag_id) VALUES (1,1),(1,2),(1,1),(1,4),(1,5);
//因为有了IGNORE参数,报错的那一条会被忽略,下面的继续执行--累计成功4条记录
//结果如下图

[SQL] INSERT IGNORE INTO dodo_tag (user_id,tag_id) VALUES (1,1),(1,2),(1,1),(1,4),(1,5);
受影响的行: 4
时间: 0.005s
[SQL] 
#INSERT INTO dodo_tag (user_id,tag_id) VALUES (1,1);

受影响的行: 0
时间: 0.002s


//Yii2中batchInsert的方法
public function batchInsert($table, $columns, $rows){
    $sql = $this->db->getQueryBuilder()->batchInsert($table, $columns, $rows);
    return $this->setSql($sql);
}

insert_into_ignore

详细各位已经才看出了端倪。其实这个时候有ignore是一件很好的事,我把联系人和标签都设为主键,我不需要先去判断该标签是否已被打过该标签,直接执行,mysql帮我们执行了去重等功能,大大的赞。ignore在其他地方也很多用途,欢迎各位指出,共同学习。

Yii2数据库操作之批量插入batchInsert()

replace into 也是超好的一个办法。。

最能阻挡你进步的,就是你永远不知道自己有多差。