Yii2的bacthInsert以及MySQL中的INSERT IGNORE INTO 批量
- 11540
- 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); }
详细各位已经才看出了端倪。其实这个时候有ignore是一件很好的事,我把联系人和标签都设为主键,我不需要先去判断该标签是否已被打过该标签,直接执行,mysql帮我们执行了去重等功能,大大的赞。ignore在其他地方也很多用途,欢迎各位指出,共同学习。
replace into 也是超好的一个办法。。
最能阻挡你进步的,就是你永远不知道自己有多差。
相关阅读
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
热门文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
最新文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例