我需要将大量的记录插入到数据库表中。我正在从CSV文件中获取数据。为了获得良好的性能,我考虑使用一个多插入语句。所以我做了一些类似的事情:
foreach($data as $key => $value) {
$insert[] = [
'id' => $value->id, 'is_published' => $value->is_published,
"first_name" => $value->first_name, "middle_name" => $value->middle_name, "last_name" => $value->last_name,
"description" => $value->description,
"created_at" => date("Y-m-d H:i:s",strtotime($value->created_at)),
"updated_at" => date("Y-m-d H:i:s",strtotime($value->changed_at))
];
}
if(!empty($insert)){
Model::insert($insert);
}但在这样做的过程中,我总是看到一个错误:
mysql服务器消失了错误。
我通过打印查询来调试它,并且我观察到,通过这样做,Laravel没有处理描述值中的单引号或双引号,就像它在usiung $model::save();中自动执行的那样。如果描述值中包含单引号'或双引号",则打印的查询版本会中断。
但如果我做了一些事情
foreach($data as $key=>$value){
$model = new Model();
$model->id = $value->id;
$model->description = $value->description;
blah blah bla
$model->save();
}它成功地运行,没有产生任何错误。有人能告诉我如何纠正这个问题吗?
发布于 2016-09-26 17:08:39
这是由于大量的数据,没有错的报价问题。当您试图一次使用多插入插入所有行时,数据集会变得太重。要么您需要增加max_allowed_packet,要么您需要分块完成。你可以用块来做这个。假设您想一次插入100个元素。你可以做这样的事。
if(!empty($insert))
{
$collection = collect($insert)->chunk(100)->toArray();
foreach ($collection as $insert)
{
// It will insert 100 items at a time
Model::insert($insert);
}
}希望这会有所帮助:)
发布于 2016-09-26 07:16:45
您尝试大容量插入的记录有多少?你能试两下吗?你能试着做几个批量插入(比如100×100)吗?
通常,错误Mysql has gone away意味着数据库服务器由于等待太多的数据(您的查询太大)而终止了查询。
您通常可以在max_allowed_packet中将一个较高的值设置为my.conf变量,以允许您一次发送更多数据。
https://stackoverflow.com/questions/39634178
复制相似问题