我有大约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下面找到了这个问题的答案,但它远非优雅。
答案 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() { /* */ });