如何在插入时自动将日期设置为当前日期
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在插入时自动将日期设置为当前日期相关的知识,希望对你有一定的参考价值。
我有下表
CREATE TABLE ex(
id INTEGER PRIMARY KEY,
dat DATE NOT NULL CHECK(dat IS date(dat))
);
我想在每次插入时自动将dat设置为date('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
我怎样才能解决这个问题 ?
答案
尝试删除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限制了触发器的递归深度,以防止涉及递归触发器的语句使用无限量的内存。
在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。
Maximum Depth Of Trigger Recursion
另一答案
你不需要任何触发器。
CREATE TABLE `ex ` ( `id` INTEGER PRIMARY KEY,`dat` DATE NOT NULL DEFAULT (datetime('now')) )
以上是关于如何在插入时自动将日期设置为当前日期的主要内容,如果未能解决你的问题,请参考以下文章