Laravel:有没有办法执行快速批量更新?

如何解决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,'20','30','40') 
WHERE id IN (2,5);

根据我的google搜索快速方式在大规模时比慢速方式快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,?) 
    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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?