我在数据库中有以下表格字段:
id, user_id, permission_id, value, created.
我有一个数组的结果,一次可能包含20个以上的不同值。整个包含permission_id
值,其余字段类似。类似于user_id
的{{1}}只会与每个permission_id
相同,而value
始终为1
,created
与包含当前日期相同和时间。
现在我可以使用以下代码插入数据库:
$user_perms=$this->input->post('permissions');
foreach($user_perms as $perms) {
$userPerms['permission_id']=$perms;
$userPerms['user_id']=$uid;
$userPerms['value']=1;
$userPerms['created']=date("Y-m-d H:i:s");
$this->admins->insertPerms($userPerms);
}
现在运行得非常好。但我想让它更有效率和更快。您可能已经注意到我在foreach循环中运行insert query
。因此,当用户单击后端的提交时,查询可能一次运行30次以上。这不是一个好主意。
因此,如何在不使用循环的情况下插入数据?
答案 0 :(得分:1)
您可以使用$this->db->insert_batch()
一次插入多行:
$this->db->insert_batch(
'table_name',
array(
// first row:
array('permission_id' => 1, 'user_id' => 1, 'value' => 1, 'created' => '...'),
// second row:
array('permission_id' => 2, 'user_id' => 1, 'value' => 1, 'created' => '...')
)
);
(阅读更多here)
然而,你显然不会以这种方式避免foreach循环,因为你需要以某种方式创建你传递给它的数据数组......
因此,优化它的另一种方法是在事务中运行这些插入。那个(至少关注SQL)相当于在一个查询中一次性插入它们,因为它的COMMIT是最昂贵的操作,因此1次提交快于20次提交。