2010-06-05 2 views
2

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

Вы правы о моем SQLite версия. Это не сработало, потому что я использовал плагин SQLite Manager 0.5.15 для Firefox. Он работал, когда я использовал официальный sqlite3.exe. –

+0

Похоже, что я получаю сообщение «Ошибка: слишком много уровней триггерной рекурсии», когда я использую его со столом с более чем 1000 строк. Мне придется реализовать текущие итоги другим способом. –

Смежные вопросы