【发布时间】:2021-07-16 12:01:49
【问题描述】:
我最近在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);
根据我的google搜索,fast方式在大规模上比slow方式快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);
这将生成一个包含多条记录的插入语句,而不是多个插入语句。
【问题讨论】:
-
你能addthe Laravel code you already have回答你的问题吗?
-
@shaedrich 我已经添加了我想要的代码格式
-
你为什么要
$model->getAttributes()?如果您已经在模型中设置了修改后的值,您可以使用$model->save()。 -
您可以使用此可能重复的 sql 并将其转换为您的查询生成器,stackoverflow.com/questions/3432/multiple-updates-in-mysql
-
@shaedrich 当我在循环中执行 model->save() 时,我将生成两个不同的插入 sql,而如果我执行 table()->insert(params),我将有一个插入 sql生成“值”之后的两行,这要快得多。
标签: mysql laravel sql-update bulkupdate