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

时间:2018-05-13 19:30:35

标签: sqlite recursion

我有下表

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

我该如何解决这个问题?

2 个答案:

答案 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。

Maximum Depth Of Trigger Recursion

答案 1 :(得分:1)

你不需要任何触发器。

CREATE TABLE `ex ` (  `id` INTEGER PRIMARY KEY,`dat` DATE NOT NULL DEFAULT (datetime('now')) )