Рассчитать промежуточную сумму в таблице SQLite с помощью триггеров - PullRequest
2 голосов
/ 05 июня 2010

Как создать триггер SQLite для вычисления промежуточных итогов по таблице «Факт»? Следующий код SQL должен обновить таблицу AccountBalances так, чтобы столбец Balance насчитывал 1, 2, 3, ... rowcount. Однако триггер обновляет только 2-ю строку, даже когда я включил 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

1 Ответ

0 голосов
/ 05 июня 2010
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...