yii批量数据插入
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批量数据插入的更多相关文章
- MyBatis Plus 批量数据插入功能,yyds!
最近 Review 小伙伴代码的时候,发现了一个小小的问题,小伙伴竟然在 for 循环中进行了 insert (插入)数据库的操作,这就会导致每次循环时都会进行连接.插入.断开连接的操作,从而导致一定 ...
- EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除
原文链接:http://blog.csdn.net/fanbin168/article/details/51485969 批量插入 (17597条数据批量插入耗时1.7秒) using Sys ...
- [oracle/java/sql]用于上十万批量数据插入Oracle表的Java程序
程序下载:https://files.cnblogs.com/files/xiandedanteng/LeftInnerNotExist20191222.rar 原理:Oracle的Insert al ...
- 原创 SqlParameter 事务 批量数据插入
不错,很好,以后防注入批量事务提交虽然麻烦点研究了几个小时,但不会是问题了 SqlCommand cmd; HelpSqlServer helps = new HelpSqlServer(); //定 ...
- 使用SqlBulkCopy进行批量数据插入
Dim dt As DataTable = New DataTable() dt.Columns.Add("DtCostProductRuleGUID", GetType(Guid ...
- KingbaseES批量数据加载的实践技巧
有时,KingbaseES数据库需要在单个或最少的步骤中导入大量数据,这通常称为批量数据导入.其中数据源通常是一个或多个大文件,这个过程有时可能非常慢. 造成性能不佳的原因有很多:索引.触发器.外键. ...
- Yii读取TXT文件数据插入到数据库
个人平时会用到的方法,记录一下并分享给需要的朋友,Yii批量添加还需要clone一下model才可以,不然只会插入一条数据. 也可以把文件通过参数的方式调入到方法中. // 读取CVS文件 funct ...
- sql 根据指定条件获取一个字段批量获取数据插入另外一张表字段中+MD5加密
/****** Object: StoredProcedure [dbo].[getSplitValue] Script Date: 03/13/2014 13:58:12 ******/ SET A ...
- .NET批量大数据插入性能分析及比较
数据插入使用了以下几种方式 1. 逐条数据插入2. 拼接sql语句批量插入3. 拼接sql语句并使用Transaction4. 拼接sql语句并使用SqlTransaction5. 使用DataAda ...
随机推荐
- Django2.0——django-filter: TypeError at *** __init__() got an unexpected keyword argument 'name'
在使用 Django2.0 版本的 Django Rest Framwork 时,Django DeBug 报错 django-filter: TypeError at *** __init__() ...
- Kubernetes系列三:二进制安装Kubernetes环境
安装环境: # 三个节点信息 192.168.31.11 主机名:env11 角色:部署Master节点/Node节点/ETCD节点 192.168.31.12 主机名:env12 角色:部署Node ...
- 前端Js复习-前后台的搭建-结合Bootstrap和JQuery搭建vue项目
流式布局思想 """ 页面的尺寸改变动态改变页面布局,或是通过父集标签控制多个子标签,这种布局思想就称之为 - 流式布局思想 1) 将标签宽高设置成 百分比,就可以随屏幕 ...
- ZJNU 1153 - 找单词——中级
状态转移b[i]记录价值为i的单词种类数d[j+k*i]+=b[j] , k<=a[i]&&j+k*i<=50表示价值为j+k*i的单词可以由价值为j的单词加上k个i字母转 ...
- tesseract系列(3) -- tesseract训练
tessract的训练有个工具叫 jTessBoxEditor 1.jTessBoxEditor是用java写的,首先要装java的环境 jdk-8u191-windows-x64.exe 这个我想从 ...
- WIFI模块AP和STA模式分别是什么意思
无线AP(Access Point):即无线接入点,它用于无线网络的无线交换机,也是无线网络的核心.无线AP是移动计算机用户进入有线网络的接入点,主要用于宽带家庭.大楼内部以及园区内部,可以覆盖几十米 ...
- Eclipse中配置使用本地schema或dtd文件
问题:在设备不能正常联网的情况下,无法获取到网络上的 dtd 或 schema,编写配置文件的 XML 文档就没有了提示功能. 一般情况下,下载的 Jar 包或者 Zip 包中都会包含需要的 sche ...
- PAT甲级——1019 General Palindromic Number
A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...
- vs2015的密钥
最近一直提示VS要登陆,登陆完就说评估期已到,搞得很烦. VS2015 enterprise版本得密钥: HM6NR-QXX7C-DFW2Y-8B82K-WTYJV 亲测有效!!! 专业版本的 ...
- python之golb模块
golb模块可以查找符合特定规则的文件路径名,查找文件名使用三种不同的匹配符:‘*’,‘?’,‘[]’.'*'匹配0个或多个字符,'?‘匹配单个字符,’[]‘匹配指定范围内的字符,比如[A-Z] 1. ...