如何在插入时自动将日期设置为当前日期

问题描述 投票:1回答:2

我有下表

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

我怎样才能解决这个问题 ?

sqlite recursion
2个回答
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限制了触发器的递归深度,以防止涉及递归触发器的语句使用无限量的内存。

在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


1
投票

你不需要任何触发器。

CREATE TABLE `ex ` (  `id` INTEGER PRIMARY KEY,`dat` DATE NOT NULL DEFAULT (datetime('now')) )
© www.soinside.com 2019 - 2024. All rights reserved.