插入时自动设置当前日期触发递归错误的解决方法
解决SQLite触发器递归错误的方案
这个递归错误的根源在于你用了AFTER INSERT触发器来事后更新数据——当插入操作完成后,触发器里的UPDATE语句会修改同一张表的记录,而SQLite默认允许触发器递归调用,这就导致触发器被反复触发,最终超过了递归深度限制。
最优解决方案:用BEFORE INSERT触发器直接赋值
不需要事后更新,我们可以在插入数据之前就把dat字段设置为当前日期,这样完全避免了递归问题:
CREATE TRIGGER setTrigger BEFORE INSERT ON ex FOR EACH ROW BEGIN SET NEW.dat = date('now'); END;
更简单的方案:给字段设置默认值
其实连触发器都不需要,直接在表定义里给dat字段指定默认值,SQLite会自动在插入时填充当前日期:
CREATE TABLE ex( id INTEGER PRIMARY KEY, dat DATE NOT NULL DEFAULT(date('now')) CHECK(dat IS date(dat)) );
这样每次插入时,如果没有手动指定dat的值,数据库会自动用date('now')填充,既简洁又不会有递归问题。
为什么原来的触发器会出错?
你的AFTER INSERT触发器在插入完成后执行UPDATE操作,这个修改操作会触发SQLite的触发器递归机制——虽然是UPDATE而非INSERT,但SQLite默认允许触发器嵌套调用,循环往复最终触发了"too many levels of recursion"错误。而BEFORE INSERT触发器是在插入动作执行前修改待插入的行数据,不需要额外的更新操作,自然不会触发递归。
内容的提问来源于stack exchange,提问作者unnamed
相关产品推荐
相关产品推荐

