SQLite插入触发器计算Duration始终为7的问题排查
触发器计算Duration始终返回7的问题排查与解决
我来帮你捋清楚这个问题——你的触发器逻辑里有个很容易忽略的错误,才会导致每次插入后Duration都固定是7,而单独跑查询却能得到正确结果。
问题根源分析
你当前的触发器代码里犯了两个关键错误:
- 错误地更新了整个表:你用
UPDATE StudentData set duration = ...语句,这会修改表中所有行的Duration字段,而不是只给你正要插入的新行赋值。 - 子查询没有限定范围:子查询
select cast( (julianday(enddatetime) - julianday(startdatetime) ) *24 * 60 *60 as integer) from StudentData没有指定WHERE条件,会返回表中所有行的计算结果。SQLite在这种场景下会默认取第一行的结果,如果你的表之前恰好有一行计算后的值是7,那所有行都会被改成这个数。
而你单独执行查询时,应该是加了WHERE条件限定了某一行,所以能得到正确的时间差,这就和触发器里的逻辑形成了差异。
修正后的触发器代码
BEFORE INSERT触发器的正确用法是直接通过NEW关键字操作要插入的新行,不需要执行UPDATE语句。修改后的代码如下:
CREATE TRIGGER duration_trigger BEFORE INSERT ON StudentData BEGIN SET NEW.duration = CAST( (julianday(NEW.enddatetime) - julianday(NEW.startdatetime)) * 24 * 60 * 60 AS INTEGER); END;
代码解释
NEW.enddatetime和NEW.startdatetime直接引用当前要插入的新行的时间字段,确保计算的是这一行的时间差。- 直接给
NEW.duration赋值,在插入操作执行前就把正确的秒数填入新行的Duration字段,既不会影响表中其他已存在的行,也能保证结果准确。
你可以删掉原来的触发器,创建这个新的触发器再测试,应该就能得到正确的Duration值了。
内容的提问来源于stack exchange,提问作者iosappdevguy
相关产品推荐
相关产品推荐

