1
我有一个表ops
包含一个帐户的操作,这个帐户的余额和一个索引给出这些操作的时间顺序。有没有办法使用sqlite访问触发器中前一行的值?
idx op_sum account_balance
1 200 200
2 -30 170
4 -20 160 -- this operation has idx=4 so the balance is accurate!
3 10 180
触发器确保idx
保持唯一。
CREATE TRIGGER on_insert_before BEFORE INSERT ON ops
WHEN (SELECT op_sum FROM ops WHERE idx=NEW.idx)
BEGIN
UPDATE ops SET idx=idx+1 WHERE idx>=NEW.idx;
END;
我现在想添加一个触发器添加新的操作时,在考虑按时间顺序排列,并具有超强的idx
如果任何更新行,可以计算account_balance
。
举个例子,如果我这样做:INSERT INTO ops(idx, op_sum) VALUES(2,-90);
我的表应该看起来像:
idx op_sum account_balance
1 200 200
3 -30 80
5 -20 70
4 10 90
2 -90 110
我想这样的事情:
CREATE TRIGGER on_insert_after AFTER INSERT ON ops
FOR EACH ROW
BEGIN
UPDATE ops SET account_balance=
(CASE WHEN idx=1
THEN op_sum
ELSE (SELECT account_balance FROM ops WHERE idx=idx-1)+op_sum
END);
END;
但它没有工作(更确切地说,这部分不起作用(SELECT account_balance FROM ops WHERE idx=idx-1)
)。
我也一直在尝试用递归公用表表达式,这会给我准确的结果:
WITH RECURSIVE
cnt(x,y,z) AS (VALUES(1,200,200) UNION ALL
SELECT
x+1,
(SELECT op_sum FROM ops WHERE idx=x+1),
z+(SELECT op_sum FROM ops where idx=x+1)
FROM cnt where x<(select max(idx) from ops))
SELECT x,y,z FROM cnt;
但我想知道是否有办法做到这一点我的表内,与触发。
'idx'和'idx'指的是相同的值。你已经在另一个触发器中使用了'NEW'。阅读[documentation](http://www.sqlite.org/lang_createtrigger.html)。 – 2014-08-30 15:55:38
@CL'WHERE idx = NEW.idx-1'触发器不会遍历整个表,并且不会更新具有上级idx的行。 – jkd 2014-08-30 16:04:31