更新 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 表中的大量行的主要内容,如果未能解决你的问题,请参考以下文章

使用不同的列集更有效地更新大量行?

如何删除EXCEL表中的大量数据行,要删除的行数大概8万

想在mysql数据库中的表中插入一列,怎么做?

在 postgres 中更新具有大量删除的表的主键序列

大量 CSV 数据到一个数据库中的新 MySQL 表中

使用php从csv快速更新大量数据mysql [关闭]