如何解决Laravel:有没有办法执行快速批量更新?
缓慢的方式:
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,'20','30','40')
WHERE id IN (2,5);
根据我的google搜索,快速方式在大规模时比慢速方式快50倍,所以我想知道Laravel是否支持这种类型的批量更新,而无需执行自己生成的原始sql。
另外,如果有人熟悉 MysqL 并且可以告诉我这是否真的快得多,如果有任何场景,这种方法实际上更糟,我会非常优雅。
编辑(根据评论中的要求):
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,?)
WHERE id IN (?,?)
",[
'Mary','Nancy','Oliver','20','30','40',5
]);
从技术上讲,这也应该有效。还没检查过:
$sql = DB::table('users')->update([
['name' => DB::raw("ELT(FIELD(id,'Mary','Oliver')")],['age' => DB::raw("ELT(FIELD(id,'40')")]
])
->whereIn('id',[ 2,5 ]);
,
另一种方法:
INSERT INTO t
(name,age,id)
VALUES
('Mary',20,2),('Nancy',30,4),('Oliver',40,5)
ON DUPLICATE KEY UPDATE name = VALUES(name);
假设 ids 已经在表中并且它有 PRIMARY KEY(id)
,那么会有任何 INSERTs
,只有 UPDATEs
——这就是你想要的。
name = VALUES(name)
是一个虚拟的空操作。它需要在 MySQL 8.0 中更改为 name = NEW.name
。
更新 student
set roll='12',fee=fee-10 where roll='15'
将此示例用于您的代码。这是为 mysql 支持任何平台的更简单、最快捷的方式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。