Laravel - 批量插入重复键更新大数据集

时间:2016-01-15 14:30:47

标签: php mysql laravel eloquent

我有大约80k的记录,我需要每天多次运行插入/更新脚本。

INSERT INTO `my_rankings` (`id`, `rank`) VALUES (1,100),(2,99)(3,102)...(80000,3) 
  ON DUPLICATE KEY UPDATE `rank` = values(`rank`);

这些记录目前采用数组格式:

$rankings = [
  ['id' => 1, 'rank' => 100],
  ['id' => 2, 'rank' => 99],
  ['id' => 3, 'rank' => 102],
  ...
  ['id' => 80000, 'rank' => 3],
]

我可以运行上述更新查询吗?

我看过Eloquent的Model::updateOrCreate(...)。但是,我不认为我可以将其用于批量插入/更新。

我想避免在我的foreach数组上使用$rankings并插入/更新单个记录,因为脚本需要的时间太长。

我在https://stackoverflow.com/a/34815725/1239122下面找到了这个问题的答案,但它远非优雅。

2 个答案:

答案 0 :(得分:4)

我有一个解决方案 - 它不优雅,但速度非常快。 1.6s为80k记录。 任何更好的解决方案都会非常感激。

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
     .validate()
     .responseJSON { response in
         switch response.result {
         case .Success:
             print("Validation Successful")
         case .Failure(let error):
             print(error)
         }
     }

答案 1 :(得分:2)

使用数据库事务。

DB::beginTransaction();
foreach ($bajillionRecords as $record) {
    $record->update();
}
DB::commit();

这将存储您的更改,然后在运行commit()时将它们提交到数据库。你也可以这样做一个闭包:

DB::transaction(function() { /* */ });