2010-06-05 95 views
2

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

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 

回答

0
  1. 请检查SQLITE_MAX_TRIGGER_DEPTH值。它可以设置为1而不是默认值1000吗?

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

请注意,以下为我工作的100%确定

DROP TABLE “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 
+0

你说得对,我的SQLite版。它不起作用,因为我使用了Firefox的SQLite Manager 0.5.15插件。它在我使用官方的sqlite3.exe时起作用。 – 2010-06-05 02:54:07

+0

当我将它用于超过1000行的表格时,看起来我得到了“错误:触发器递归的级别过多”。我将不得不以另一种方式实施运行总计。 – 2010-06-05 03:47:05