yii框架批量插入数据有两种方法,第一种是循环多次插入一次批量插入,第一种方法要注意插入数据中间有一次数据插入失败要注意回滚事务

循环插入数据

第一种方法

$model = new User();
$transaction=Yii::app()->db->beginTransaction();
try{
foreach($data as $attributes)
{
$_model = clone $model; //克隆对象
$_model->setAttributes($attributes);
$_model->save();
}
$transaction->commit();
} catch(Exception $e){
$transaction->rollBack();
}

第二种方法

$model = new User();
$transaction=Yii::app()->db->beginTransaction();
try{
foreach($data as $attributes)
{
$model->isNewRecord = true;
$model->setAttributes($attributes);
$model->save() && $model->id=0;
}
$transaction->commit();
} catch(Exception $e){
$transaction->rollBack();
}

批量插入数据

生成SQL:INSERT INTO users (id, name) VALUES (:id0, :name0),(:id1, :name1)

绑定参数:array(2) {[":id0"]=>int(1),[":name0"]=>string(4) "John"}

<?php
/**
* 批量插入
* @param String $table 表名
* @param Array $array_columns 插入数据
* @return Bool 失败返回false,成功返回true
*/
function insertSeveral($table, $array_columns)
{
$sql = '';
$params = array();
$i = 0;
foreach ($array_columns as $columns) {
$names = array();
$placeholders = array();
foreach ($columns as $name => $value) {
if (!$i) {
$names[] = $this->_connection->quoteColumnName($name);
}
if ($value instanceof CDbExpression) {
$placeholders[] = $value->expression;
foreach ($value->params as $n => $v)
$params[$n] = $v;
} else {
$placeholders[] = ':' . $name . $i;
$params[':' . $name . $i] = $value;
}
}
if (!$i) {
$sql = 'INSERT INTO ' . $this->_connection->quoteTableName($table)
. ' (' . implode(', ', $names) . ') VALUES ('
. implode(', ', $placeholders) . ')';
} else {
$sql .= ',(' . implode(', ', $placeholders) . ')';
}
$i++;
}
return $this->setText($sql)->execute($params);
}
$rows = array(
array('id' => 1, 'name' => 'John'),
array('id' => 2, 'name' => 'Mark')
);
echo insertSeveral('users', $rows);

zend framework实现

/**
* 批量插入
* @param array $rows 记录数组
* @return boolen 成功返回true,否则返回false
* @todo insert into t_promotion_plan_span (start_time,end_time,plan_id)
* values (:start_time0,:end_time0,:plan_id0), (:start_time1,:end_time1,:plan_id1)
*/
public function insertAll($rows) {
try {
$names = $values = $placs = array();
$db = $this->getAdapter();
$sql='';
$i=0;
//字段名数组
$names = array_keys($rows[0]);
foreach ($names as $key=>$value) {
$names[$key] = '`'.$value.'`';
}
//占位符数组和值数组
foreach ($rows as $row) {
foreach ($row as $name=>$val) {
$placeholder = ":".$name."_".$i;
$temp[]=$placeholder;
$values[$placeholder]=$val;
}
$placs[] = "(".implode(',',$temp).")";
$temp=array();
$i++;
}
$sql = sprintf(
"insert into %s (%s) values %s",
'`'.$this->_name.'`',
implode(',',$names),
implode(',',$placs)
);
$db->query($sql,$values);
return true;
} catch (Exception $e) {
return false;
}
}
ROWS
rows = array(2) {
[0]=>
array(2) {
["adpos_flag"]=>
string(5) "pdgl2"
["adpos_id"]=>
string(1) "1"
}
[1]=>
array(2) {
["adpos_flag"]=>
string(4) "pdgl"
["adpos_id"]=>
string(1) "2"
}
} SQL
string(125) "insert into `cy_res_web_adpos_group` (`adpos_flag`,`adpos_id`) values (:adpos_flag_0,:adpos_id_0),(:adpos_flag_1,:adpos_id_1)" VALUES
array(4) {
[":adpos_flag_0"]=>
string(5) "pdgl2"
[":adpos_id_0"]=>
string(1) "1"
[":adpos_flag_1"]=>
string(4) "pdgl"
[":adpos_id_1"]=>
string(1) "2"
}

yii批量数据插入的更多相关文章

  1. MyBatis Plus 批量数据插入功能,yyds!

    最近 Review 小伙伴代码的时候,发现了一个小小的问题,小伙伴竟然在 for 循环中进行了 insert (插入)数据库的操作,这就会导致每次循环时都会进行连接.插入.断开连接的操作,从而导致一定 ...

  2. EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除

    原文链接:http://blog.csdn.net/fanbin168/article/details/51485969   批量插入 (17597条数据批量插入耗时1.7秒)   using Sys ...

  3. [oracle/java/sql]用于上十万批量数据插入Oracle表的Java程序

    程序下载:https://files.cnblogs.com/files/xiandedanteng/LeftInnerNotExist20191222.rar 原理:Oracle的Insert al ...

  4. 原创 SqlParameter 事务 批量数据插入

    不错,很好,以后防注入批量事务提交虽然麻烦点研究了几个小时,但不会是问题了 SqlCommand cmd; HelpSqlServer helps = new HelpSqlServer(); //定 ...

  5. 使用SqlBulkCopy进行批量数据插入

    Dim dt As DataTable = New DataTable() dt.Columns.Add("DtCostProductRuleGUID", GetType(Guid ...

  6. KingbaseES批量数据加载的实践技巧

    有时,KingbaseES数据库需要在单个或最少的步骤中导入大量数据,这通常称为批量数据导入.其中数据源通常是一个或多个大文件,这个过程有时可能非常慢. 造成性能不佳的原因有很多:索引.触发器.外键. ...

  7. Yii读取TXT文件数据插入到数据库

    个人平时会用到的方法,记录一下并分享给需要的朋友,Yii批量添加还需要clone一下model才可以,不然只会插入一条数据. 也可以把文件通过参数的方式调入到方法中. // 读取CVS文件 funct ...

  8. sql 根据指定条件获取一个字段批量获取数据插入另外一张表字段中+MD5加密

    /****** Object: StoredProcedure [dbo].[getSplitValue] Script Date: 03/13/2014 13:58:12 ******/ SET A ...

  9. .NET批量大数据插入性能分析及比较

    数据插入使用了以下几种方式 1. 逐条数据插入2. 拼接sql语句批量插入3. 拼接sql语句并使用Transaction4. 拼接sql语句并使用SqlTransaction5. 使用DataAda ...

随机推荐

  1. redis备忘录

    Redis 是一个基于内存的高性能key-value数据库.Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数 ...

  2. HDU-6514 Monitor(二维前缀和+差分)

    http://acm.hdu.edu.cn/showproblem.php?pid=6514 Problem Description Xiaoteng has a large area of land ...

  3. vim中的正则表达式替换

    这个总结的不错 http://tanqisen.github.io/blog/2013/01/13/vim-search-replace-regex/

  4. C# 扩张方法的语法

    using System; namespace ConsoleApp { class Program { static void Main(string[] args) { string str = ...

  5. windows10使用npm安装vue、vue-cli

    从网上下载了一个免费的vue.js前端模板,准备和Django整合出一个项目出来,然后发现前端代码都是.vue文件,已经整合过.html,很容易,感觉这个.vue的前端稍微复杂一些 本文主要参考博客及 ...

  6. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-关于parfor的问题

    1 我们知道MATLAB支持并行运行一般有四种模式: 第一种模式:本机调用多核CPU性能并行运算 第二种模式:本机调用GPU性能并行运算 第三种模式:多计算机组成集群,调用集群CPU性能并行运算 第四 ...

  7. 三十四、www服务apache进阶

    9.虚拟主机:部署多个站点,每个站点希望用不同的站点域名和站点目录,或者是不同的端口和不同的IP,则需要虚拟主机,简单理解就是一个http服务要配置多个站点,就要虚拟主机. apache虚拟主机分为三 ...

  8. [LC] 255. Verify Preorder Sequence in Binary Search Tree

    Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...

  9. dedecms_5.7 download.php SQL注入

    最近在看Web渗透与漏洞挖掘,这本书的编写目的感觉非常的不错,把渗透和代码审计结合在一起,但是代码审计部分感觉思路个人认为并不是很清晰,在学习dedecms v5.7 SQL注入的时候就只看懂了漏洞, ...

  10. 变得“不正经”的CES,竟然越来越好玩了

    在所有科技界的展会中,国人最熟悉的当属CES.作为科技行业的风向指示标,CES一直在扮演着重要的潮流指引者角色.不过,现在的CES似乎变得越来越"不正经"了!原本CES是国际消费类 ...