我在一个表上有一个触发器,它在任何新插入时被触发......这是触发器的代码。此触发器必须以秒为单位计算持续时间并将记录插入表中。
CREATE TRIGGER duration_trigger
BEFORE INSERT on StudentData
BEGIN
UPDATE StudentData set duration = (select cast( (julianday(enddatetime) - julianday(startdatetime) ) *24 * 60 *60 as integer) from StudentData);
END
在StudentsData
表Duration
列中定义为INTEGER
,
StartDatetime
和EndDatetime
定义为TEXT
这是我的问题。
触发器被触发,但“持续时间”列中的值始终为7
当我执行SQL工具中触发器中的相同选择查询时,它会以秒为单位给出正确的持续时间。数据库上的触发器没有产生相同的结果......可能是什么问题?
我还在表格中附加触发器数据的屏幕截图,并从同一个表中选择查询结果。
触发后的表格结果。
选择查询结果
答案 0 :(得分:2)
基本上,您要更新所有行,因为您没有为更新指定 WHERE 子句。因此,最后一次成功更新会将值应用于所有行,因此它们都是7。
此外,在插入行之前,还有哪些内容需要更新?我不认为这可以通过类比来做; 在你建造墙壁之前画墙。
现在你可以在插入后更新,但是在使用UPDATE时需要小心,即如果你想更新除了所有行之外的任何东西,那么你需要将更新限制为所需的行。 WHERE子句可以做到这一点。
因此,如果您要确保插入的列设置为无效值(就您的数据视图而言,例如 -1 的持续时间仅适合Dr. Who(< em>向任何其他时间旅行者道歉))。
也可以使用Null。
但是,我更喜欢使用专门设置的值。假设插入的行持续时间的值为-1(例如duartion INTEGER DEFAULT -1
)则: -
CREATE TRIGGER duration_trigger001
AFTER INSERT on StudentData
BEGIN
UPDATE StudentData SET duration = ((julianday(enddatetime) - julianday(startdatetime)) * 24 * 60 * 60) WHERE duration = -1;
END;
会工作,例如: -