Spatialite插入触发器中如何获取修改后的age字段值?
解决方案
你的问题核心是:触发器中NEW对象代表的是插入操作的原始数据,后续对arbres表的UPDATE不会修改NEW里的age值,所以归档时拿到的还是初始默认值0。结合Spatialite不支持变量的限制,有两种可行方案:
方案1:复用计算逻辑直接写入归档表
不需要依赖更新后的arbres表字段,直接在归档插入语句中重复age的计算表达式,同时完成主表的age更新:
-- 删除原有触发器(如果存在) DROP TRIGGER IF EXISTS trig_after_update_arbres; CREATE TRIGGER trig_after_insert_arbres AFTER INSERT ON arbres FOR EACH ROW BEGIN -- 更新主表的age字段 UPDATE arbres SET age = strftime('%Y', 'now') - strftime('%Y', NEW.dat_planta) + NEW.age_planta WHERE id = NEW.id; -- 归档时直接计算age值,避免依赖NEW.age INSERT INTO archive_arbres ( id_arbres, essence, age, dat_planta, age_planta, geometry) VALUES ( NEW.id, NEW.essence, strftime('%Y', 'now') - strftime('%Y', NEW.dat_planta) + NEW.age_planta, NEW.dat_planta, NEW.age_planta, NEW.geometry); END;
方案2:改用BEFORE INSERT触发器预计算age
把计算逻辑移到BEFORE INSERT阶段,直接给NEW.age赋值,这样插入到主表时age已经是正确值,归档时直接使用NEW.age即可:
-- 删除原有触发器(如果存在) DROP TRIGGER IF EXISTS trig_after_update_arbres; -- 插入前预计算age CREATE TRIGGER trig_before_insert_arbres BEFORE INSERT ON arbres FOR EACH ROW BEGIN SET NEW.age = strftime('%Y', 'now') - strftime('%Y', NEW.dat_planta) + NEW.age_planta; END; -- 插入后执行归档 CREATE TRIGGER trig_after_insert_archive AFTER INSERT ON arbres FOR EACH ROW BEGIN INSERT INTO archive_arbres ( id_arbres, essence, age, dat_planta, age_planta, geometry) VALUES ( NEW.id, NEW.essence, NEW.age, NEW.dat_planta, NEW.age_planta, NEW.geometry); END;
方案对比
- 方案1逻辑集中,适合不想拆分触发器的场景,唯一缺点是重复了计算表达式;
- 方案2职责拆分更清晰,计算和归档分离,后续维护更方便,推荐使用。
内容的提问来源于stack exchange,提问作者Adikte
相关产品推荐
相关产品推荐

