更新 MySQL 表中的大量行
Posted
技术标签:
【中文标题】更新 MySQL 表中的大量行【英文标题】:Update large number of row in MySQL table 【发布时间】:2020-09-08 15:14:28 【问题描述】:我正在使用关系数据库(mysql 5.7)。在这个数据库上,我有一个名为 customer_transaction 的表。在这张表上,我有 4 列:id、customer_id、type、amount
|id|customer_id |type |amount|
|--|------------|---------|------|
|1 |44 |Credit |50 |
|2 |44 |Credit |20 |
|3 |44 |Debit |30 |
|4 |10 |Credit |30 |
现在我要在此表上引入一个新的余额列(当前余额),如下所示。
|id|customer_id |type |amount|balance|
|--|------------|---------|------|-------|
|1 |44 |Credit |50 |50 |
|2 |44 |Credit |20 |70 |
|3 |44 |Debit |30 |40 |
|4 |10 |Debit |30 |-30 |
问题是,在客户交易表上,他们有近百万行,所有余额列都是0.00。
所以我想重新同步所有余额数据。但我很困惑如何重新计算和更新所有这些行。我可以通过 MySQL 查询或从我的应用程序(Laravel-php)计算和更新来更新它吗?
【问题讨论】:
是的,你可以做到。使用会话变量来保存上一行的运行余额,并根据类型是Credit
还是Debit
进行加减运算。当 customer_id` 更改时,您将变量设置回 0
。
【参考方案1】:
在 MySQL 5.x 中,窗口函数不可用,选项使用相关子查询来计算余额:
update customer_transaction ct
inner join (
select
id,
(
select sum(case type when 'Credit' then amount when 'Debit' then -amount end)
from customer_transaction ct2
where ct2.customer_id = ct1.customer_id and ct2.id <= ct1.id
) balance
from customer_transaction ct1
) ctx on ctx.id = ct.id
set ct.balance = ctx.balance
【讨论】:
但是他们是个问题。我们正在实时服务器上执行这些过程,执行需要一些时间。我认为,在执行期间,我的事务表保持锁定状态。他们有什么方法可以防止锁定。以上是关于更新 MySQL 表中的大量行的主要内容,如果未能解决你的问题,请参考以下文章