我有下表
CREATE TABLE ex(
id INTEGER PRIMARY KEY,
dat DATE NOT NULL CHECK(dat IS date(dat))
);
我希望在每次插入时自动将dat设置为日期('now')。 这就是我创建TRIGGER的原因
CREATE TRIGGER setTrigger
AFTER INSERT
ON ex
FOR EACH ROW
BEGIN
UPDATE ex
SET dat = date('now')
WHERE id = NEW.id;
END;
但我收到以下错误:
too many levels of recursion
我该如何解决这个问题?
答案 0 :(得分:2)
尝试删除FOR EACH ROW,没有必要,这可能是递归和CHECK约束的原因。
当然,您甚至不需要使用TRIGGER或CHECK约束
CREATE TABLE ex(
id INTEGER PRIMARY KEY,
dat DATE DEFAULT CURRENT_DATE
);
请注意,您只需要执行INSERT INTO ex (ID) VALUES(null);
您可能还希望考虑以下事项: -
触发器递归的最大深度
SQLite限制触发器的递归深度以防止a 涉及使用无限金额的递归触发器的语句 记忆。
在SQLite版本3.6.18(2009-09-11)之前,触发器没有 递归,所以这个限制毫无意义。从版本开始 3.6.18,支持递归触发器,但必须使用PRAGMA recursive_triggers语句显式启用。以。。。开始 版本3.7.0(2009-09-11),默认情况下启用递归触发器 但可以使用PRAGMA recursive_triggers手动禁用。该 SQLITE_MAX_TRIGGER_DEPTH仅在递归触发器有意义时才有意义 启用。
默认的最大触发递归深度为1000。
答案 1 :(得分:1)
你不需要任何触发器。
CREATE TABLE `ex ` ( `id` INTEGER PRIMARY KEY,`dat` DATE NOT NULL DEFAULT (datetime('now')) )