SQLite触发器报错:no such column: OLD.age 问题求助
问题分析:INSERT触发器引用
OLD字段引发的错误 核心问题
你在**INSERT类型的触发器bulk_update_main**里使用了OLD.age,但数据库的INSERT操作触发器上下文里根本不存在OLD对象——这就是报错no such column: OLD.age的根源。
触发器上下文对象的规则
数据库触发器针对不同操作提供的上下文对象是固定的:
- INSERT操作:仅提供
NEW对象,代表即将插入的新行数据,没有OLD(因为插入前该行不存在) - UPDATE操作:同时提供
OLD(更新前的旧数据)和NEW(更新后的新数据) - DELETE操作:仅提供
OLD对象,代表即将删除的旧行数据
你执行的是INSERT INTO main (pubKey, age) VALUES (1, 1);,触发的是INSERT类型触发器,此时调用OLD.age相当于访问一个不存在的字段,必然报错。删除这条语句后,触发器不再访问无效对象,错误自然消失。
修正建议
- 检查触发器定义:如果
bulk_update_main本来是要处理UPDATE操作,那要确保它的触发时机是AFTER UPDATE ON main(或BEFORE UPDATE),而非INSERT触发。 - 调整INSERT触发器逻辑:如果确实需要在INSERT时更新
mainCount,把OLD.age替换为NEW.age,同时根据业务需求调整count_的值(比如插入时应该是+1而非-1,这取决于你的计数逻辑)。
内容的提问来源于stack exchange,提问作者infoman
相关产品推荐
相关产品推荐

