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. java 计算函数运行时间

    long start,end; start = System.currentTimeMillis(); for (int i = 0; i < 2000000000; i++) {} end = ...

  2. Eclipse 中 Syntax error on token "Invalid Character", delete this token 的解决

    eclipse中遇到了Syntax error on token "Invalid Character", delete this token(令牌“无效字符”上的语法错误,删除此 ...

  3. Perl语言入门:第九章 使用正则表达式处理文本 示例程序和代码

    #! /usr/bin/perl use strict; use warnings; print "\n----------------------------------_substitu ...

  4. rest framework-restful介绍-长期维护

    ###############   django框架-rest framework    ############### # django rest framework 框架 # 为什么学习这个res ...

  5. 《C 程序设计语言》练习1-4

    #include<stdio.h> /*当celsius=0,1,...,100时,打印摄氏温度与华氏温度对照表; 浮点数版本*/ main () { float fahr,celsius ...

  6. Oracle中的 timestamp 和 timestamp with time zone, timestamp with local time zone

    SQL> select dbtimezone, sessiontimezone from dual; DBTIME ------ SESSIONTIMEZONE ---------------- ...

  7. android选择器汇总、仿最美应用、通用课程表、卡片动画、智能厨房、阅读客户端等源码

    Android精选源码 android各种 选择器 汇总源码 高仿最美应用项目源码 android通用型课程表效果源码 android实现关键字变色 Android ViewPager卡片视差.拖拽及 ...

  8. [LC] 125. Valid Palindrome

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...

  9. Longest Increasing Subsequence (Medium)

    第一次做题思路201511092250 1.采用map存储,key为nums[i],value为以nums[i]为结尾的最大递增子序列的长度 2.采用map里面的lower_bounder函数直接找出 ...

  10. HDU-6672-Seq

    题目传送门 ps:一般这种给一个数列求第n项,n还特别大的.要么矩阵快速幂,要么转化递推式.不过这题数据也特别多有100000组,所以就算矩阵快速幂可能也要超时,而且我还没推出来.转化递推式需要比较强 ...