【问题标题】:Calculate running total in SQLite table using triggers使用触发器计算 SQLite 表中的运行总计
【发布时间】:2026-01-27 07:10:01
【问题描述】:

如何创建 SQLite 触发器来计算“实际”表上的运行总计?下面的 SQL 代码应该更新 AccountBalances 表,以便 Balance 列从 1、2、3、... rowcount 开始计数。但是,即使我打开了 recursive_triggers,触发器也只会更新第二行。下面的结果是第 1 行 = 1,第 2 行 = 2,之后的行为空。

CREATE TEMP TABLE "AccountBalances" (
  "Id" INTEGER PRIMARY KEY, 
  "DateId" INT,
  "AccountId" INT,
  "AccountCurrAmount" REAL,
  "Balance" REAL);

INSERT INTO "AccountBalances" 
  (DateId, AccountId, AccountCurrAmount)
  SELECT DateId, AccountId, Sum(AccountCurrAmount) 
    FROM Actual 
GROUP BY DateId, AccountId 
ORDER BY AccountId, DateId;

CREATE TRIGGER UpdateAccountBalance AFTER UPDATE ON AccountBalances
BEGIN
 UPDATE AccountBalances 
    SET Balance = 1 + new.Balance 
  WHERE Id = new.Id + 1;
END;

PRAGMA recursive_triggers = 'on';

UPDATE AccountBalances 
   SET Balance = 1 
 WHERE Id = 1

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:
    1. 请检查SQLITE_MAX_TRIGGER_DEPTH 的值。是否可以将其设置为 1 而不是默认的 1000?

    2. 请检查您的 SQLite 版本。在 3.6.18 之前,不支持递归触发器。

    请注意,以下内容对我有用 100% OK

    删除表“AccountBalances”

    CREATE TEMP TABLE "AccountBalances" (
      "Id" INTEGER PRIMARY KEY, 
      "Balance" REAL);
    
    INSERT INTO "AccountBalances" values (1,0)
    INSERT INTO "AccountBalances" values (2,0);
    INSERT INTO "AccountBalances" values (3,0);
    INSERT INTO "AccountBalances" values (4,0);
    INSERT INTO "AccountBalances" values (5,0);
    INSERT INTO "AccountBalances" values (6,0);
    
    CREATE TRIGGER UpdateAccountBalance AFTER UPDATE ON AccountBalances
    BEGIN
     UPDATE AccountBalances 
        SET Balance = 1 + new.Balance 
      WHERE Id = new.Id + 1;
    END;
    
    PRAGMA recursive_triggers = 'on';
    
    UPDATE AccountBalances 
       SET Balance = 1 
     WHERE Id = 1
    
    select * from "AccountBalances";
    

    导致:

    Id  Balance
    1   1
    2   2
    3   3
    4   4
    5   5
    6   6
    

    【讨论】:

    • 你对我的 SQLite 版本是正确的。它不起作用,因为我使用了 Firefox 的 SQLite Manager 0.5.15 插件。当我使用官方的 sqlite3.exe 时它起作用了。
    • 当我将它与超过 1000 行的表一起使用时,我似乎收到“错误:触发器递归级别过多”。我将不得不以另一种方式实现运行总计。