SQLite银行交易表:如何校验新插入行余额与最后一行的关联?
SQLite触发器语法错误修正方案
原代码存在三个核心问题:
- 括号不匹配:子查询末尾多了一个冗余右括号
- 列引用错误:应检查NEW.Saldo(新插入行的saldo值),而非表中已存在的Saldo列
- 未处理空表场景:首次插入时无历史行,子查询返回NULL,需默认初始余额为0
修正后的触发器代码:
CREATE TRIGGER ChecarSaldo BEFORE INSERT ON BANORTE BEGIN SELECT RAISE(FAIL, 'NO ES EL SIGUIENTE MOVIMIENTO') WHERE NEW.Saldo != COALESCE((SELECT Saldo FROM BANORTE ORDER BY fecha DESC LIMIT 1), 0) + NEW.cargo - NEW.abono; END;
关键调整说明:
- 用
WHERE替代原代码的FROM BANORTE WHEN,无需从表中查询行,仅做条件判断即可 COALESCE函数确保首次插入时,默认初始余额为0,避免NULL值导致的计算异常- 条件改为不等于时触发错误,逻辑更准确:当新行的saldo不符合预期计算值时,抛出失败提示
内容的提问来源于stack exchange,提问作者Patricio Sosa
相关产品推荐
相关产品推荐

