首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel:有没有一种方法可以执行快速批量更新?

Laravel:有没有一种方法可以执行快速批量更新?
EN

Stack Overflow用户
提问于 2021-07-16 20:01:49
回答 3查看 401关注 0票数 0

最近,我在mySQL中遇到了一种快速批量更新的方法:

慢速方式:

代码语言:javascript
复制
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;

快速方法:

代码语言:javascript
复制
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代码在更新时是这样工作的:

代码语言:javascript
复制
foreach ($modelList as $model) {
    $model->setConnection($connection);
    $model->save();
}

我希望批量更新的是

代码语言:javascript
复制
DB::connection($connection)->table($table)->bulkUpdate($models);

据我所知,目前Laravel已经支持批量插入,如下所示:

代码语言:javascript
复制
foreach ($models as $model) {
    $attributes = $model->getAttributes();
    $params[] = $attributes;
}

DB::connection($connection)->table($table)->insert($params);

这将生成具有多条记录的一条insert语句,而不是多条insert语句。

EN

回答 3

Stack Overflow用户

发布于 2021-07-16 20:35:36

如果没有解决方案,您仍然可以使用准备好的语句:

代码语言:javascript
复制
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
]);

从技术上讲,这也应该是可行的。还没有检查过:

代码语言:javascript
复制
$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 ]);
票数 1
EN

Stack Overflow用户

发布于 2021-07-17 01:12:34

另一种方法:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2021-07-16 20:13:12

UPDATE student set roll='12',fee=fee-10 where roll='15‘

在您的代码中使用此示例。这是支持任何mysql平台的更简单、最快的方式。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68408695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档