SQLite3中触发表更新时同步更新其他表的触发器配置疑问
SQLite触发器问题:仅更新toaddress时如何获取senderip和fromaddress的值
首先得指出你原触发器里的一个关键问题:SQLite的触发器里并没有inserted这个对象哦,咱们应该用NEW(代表更新后的行记录)或者OLD(代表更新前的行记录)来获取触发行的数据。
接下来解答你的核心疑问:
- 不管你只更新
toaddress字段,还是同时更新多个字段,NEW和OLD都会包含整行的所有字段值。因为你设置的是AFTER UPDATE OF toaddress,触发条件只有toaddress被修改时才会执行触发器,所以此时senderip和fromaddress并没有被更新,NEW.senderip和OLD.senderip的值是完全一致的,fromaddress同理。 - 根据你的需求——要匹配triplets表中与更新后的tripletlist行
senderip、fromaddress、toaddress都一致的记录,直接用NEW来获取这三个字段的值就可以了,逻辑更直观。
下面是修正后的触发器代码:
CREATE TRIGGER update_accept AFTER UPDATE OF toaddress ON tripletlist FOR EACH ROW BEGIN -- 用更新后的行数据匹配triplets表,accepted字段加1 UPDATE triplets SET accepted = accepted + 1 WHERE senderip = NEW.senderip AND fromaddress = NEW.fromaddress AND toaddress = NEW.toaddress; -- 删除tripletlist中toaddress不为空的记录(保留你的原有逻辑) DELETE FROM tripletlist WHERE toaddress != ""; END;
补充一点小提醒:如果未来你的业务逻辑可能允许同时更新senderip或fromaddress,那就要区分NEW和OLD的使用场景了——如果要基于更新前的数据做匹配就用OLD,基于更新后的数据就用NEW。但就你当前的触发条件(仅更新toaddress)来说,两者没有区别。
内容的提问来源于stack exchange,提问作者be MrZulf
相关产品推荐
相关产品推荐

