最近,我在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);这将生成具有多条记录的一条insert语句,而不是多条insert语句。
发布于 2021-07-16 20:35:36
如果没有解决方案,您仍然可以使用准备好的语句:
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 ]);发布于 2021-07-17 01:12:34
另一种方法:
INSERT INTO t
(name, age, id)
VALUES
('Mary', 20, 2),
('Nancy', 30, 4),
('Oliver', 40, 5)
ON DUPLICATE KEY UPDATE name = VALUES(name);假设it已经在表中,并且它有PRIMARY KEY(id),那么就会有任何INSERTs,只有UPDATEs --这就是您想要的。
name = VALUES(name)是一个虚拟的no-op。它需要在MySQL 8.0中更改为name = NEW.name。
发布于 2021-07-16 20:13:12
UPDATE student set roll='12',fee=fee-10 where roll='15‘
在您的代码中使用此示例。这是支持任何mysql平台的更简单、最快的方式。
https://stackoverflow.com/questions/68408695
复制相似问题