【问题标题】:Update Balance column automatically in a balance ledger for different Customer IDs自动更新余额分类帐中不同客户 ID 的余额列
【发布时间】:2020-11-07 18:20:50
【问题描述】:

我正在使用 MariaDB 版本 10.2.22

我有一个分类帐表,可以通过下面的 sql 代码定义:

CREATE TABLE ledger (
  tr_id    int AUTO_INCREMENT NOT NULL COMMENT 'Transaction ID ( Primary Key)',
  cust_id  int NOT NULL COMMENT 'Customer ID',
  `date`   date NOT NULL COMMENT 'Transaction date',
  credit   decimal(10,2) DEFAULT NULL COMMENT 'Credit - paid in',
  debit    decimal(10,2) DEFAULT NULL COMMENT 'Debit - Money paid out',
  balance  decimal(10,2) DEFAULT NULL COMMENT 'Bank Balance = Credt-debit + bank Balance of previous record of the same customer ID',
  /* Keys */
  PRIMARY KEY (tr_id)
) ENGINE = InnoDB;

我已手动填表并手动输入余额。

I tr_id     I   cust_id  I date                I  credit        I  debit         I   balance     I
-------------------------------------------------------------------------------------------
I  1          I    100      I  2020-07-01   I 1000.00     I                   I   1000.00     I
I  2          I    500      I  2020-07-02   I 2000.00     I                   I    2000.00    I
I  3          I    100      I  2020-07-03   I                   I   200.00     I      800.00    I
I  4          I    500      I  2020-07-04   I                   I   500.00     I    1500.00    I

每条记录的余额=(贷方-借方)+同一个cust_id的最后余额

我想在 cust_id、日期、贷方或借方字段中插入值时自动更新余额列。 是否可以定义一个触发器,当贷方字段或借方字段的值发生变化时自动更新余额字段?我想获取此类函数的 SQL 代码。 谢谢你的期待

【问题讨论】:

  • "...last Balance" -- 如果date 列对于每个客户来说不是唯一的,则可能会出现问题。

标签: mysql mariadb database-trigger insert-update


【解决方案1】:

我不建议存放余额。这是一个派生信息,可以在需要时轻松即时计算,通常使用窗口sum()(在 MySQL 8.0 或 MariaDB 10.3 及更高版本中可用)。

相反,您可以创建一个视图:这为您提供始终最新的数据透视图,您可以像查询常规表一样进行查询。

只需从ledger 表中删除balance 列,然后按如下方式创建视图:

create view v_ledger as 
select 
    l.*,
    sum(coalesce(credit, 0) - coalesce(debit, 0)) 
        over(partition by cust_id order by date, tr_id) balance
from ledger l

【讨论】:

  • 视图在 MySQL 中没有任何好处,我可以看到,除了用于创建它们的底层查询之外
  • 我按照建议创建了一个视图,但该视图是只读视图,无法直接更新。我想使用 PHP CRUD 页面更新表格,还没有找到直接通过 View 更新页面的方法。
猜你喜欢
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多