mysql - Laravel:有没有办法执行快速批量更新?
问题描述
我最近在 mySQL 中遇到了一种快速批量更新的方法:
缓慢的方式:
UPDATE `example` SET `name` = 'Mary', `age` = '20' WHERE id = 2;
UPDATE `example` SET `name` = 'Nancy', `age` = '30' WHERE id = 4;
UPDATE `example` SET `name` = 'Oliver', `age` = '40' WHERE id = 5;
快速方法:
UPDATE `example` SET
`name` = ELT(FIELD(id,2,4,5),'Mary','Nancy','Oliver') ,
`age` = ELT(FIELD(id,2,4,5),'20','30','40')
WHERE id IN (2,4,5);
根据我的谷歌搜索,快速方式在大规模上比慢速方式快 50 倍,所以我想知道 Laravel 是否支持这种类型的批量更新,而无需执行自己生成的原始 sql。
另外,如果有人熟悉mysql并且可以告诉我这是否真的那么快,如果有任何情况,这种方法实际上更糟,我会非常优雅。
编辑(根据评论中的要求):
我当前的 Laravel 代码将像这样进行更新:
foreach ($modelList as $model) {
$model->setConnection($connection);
$model->save();
}
我想要批量更新的是
DB::connection($connection)->table($table)->bulkUpdate($models);
据我所知,目前 Laravel 已经支持批量插入,如下所示:
foreach ($models as $model) {
$attributes = $model->getAttributes();
$params[] = $attributes;
}
DB::connection($connection)->table($table)->insert($params);
这将生成一个包含多条记录的插入语句,而不是多个插入语句。
解决方案
如果没有解决方案,您仍然可以使用准备好的语句进行原始操作:
DB::update("
UPDATE `example` SET
`name` = ELT(FIELD(id,2,4,5),?,?,?) ,
`age` = ELT(FIELD(id,2,4,5),?,?,?)
WHERE id IN (?,?,?)
", [
'Mary', 'Nancy', 'Oliver',
'20', '30', '40',
2, 4, 5
]);
从技术上讲,这也应该有效。还没查:
$sql = DB::table('users')->update([
['name' => DB::raw("ELT(FIELD(id,2,4,5),'Mary','Nancy','Oliver')")],
['age' => DB::raw("ELT(FIELD(id,2,4,5),'20','30','40')")]
])
->whereIn('id', [ 2, 4, 5 ]);
推荐阅读
- android - ContentScale.FillWidth 不工作 Jetpack Compose
- python - 带有身份验证或 cookie 的 Python scrapy
- sas - 提取字符串中的第二个和第三个字符 - SAS
- php - 如何在满足某些条件的情况下更新第一次出现?
- python - 从 Python 与以太坊智能合约交互
- javascript - 如何在反应js中30秒后从dom中删除usestate元素
- python - 如何让 discord.py 中的机器人响应特定用户?
- dask - 通过 env vars 配置 dask 网关
- node.js - 键入'字符串 | undefined' 不能分配给类型 'string'。类型“未定义”不可分配给类型“字符串”
- css - 在 R 的 slickR 轮播中移动上一个下一个按钮