如何使用触发器更新插入时的字段

How to Update Fields On Insert using Trigger

多年来我一直在 Oracle 中创建和使用触发器,但是我无法完全理解在将数据插入 sqlite 数据库时如何更新字段。

我想做的就是创建一个触发器,自动将当前 DateTime 插入到 sqlite 数据库中名为 'createdDate' 的列中,用于插入的任何记录。

完成此任务的最佳方法是什么?

以下是我尝试过但没有成功的方法。

CREATE TRIGGER outputLogDB_Created_Trig
    BEFORE INSERT
        ON outputLog
      WHEN NEW.createdDate IS NULL
BEGIN
    SELECT CASE WHEN NEW.createdDate IS NULL THEN NEW.createdDate = datetime('now', 'localtime') END;
END;

以上几乎是我如何在 Oracle 中实现我的触发器的复制品,当然对 sqlite 进行了一些修改。逻辑基本一致

我错过了什么?

Later Edit - I can get it to work if I instead use AFTER INSERT and not using FOR EACH ROW

CREATE TRIGGER outputLog_Created_Trig
     AFTER INSERT
        ON outputLog
      WHEN New.createdDate IS NULL
BEGIN
    UPDATE outputLog
       SET createdDate = datetime('now', 'localtime') 
     WHERE outputLog_ID = New.rowid;
END;

但是为什么我不能在插入记录时使用新值插入记录?我是否只能在插入记录后使用更新才能将其放入其中?

我遇到的问题是我想在 createdDate 列上有一个 NOT NULL 约束。也许我只是习惯了多年来在 Oracle 中的做法?我意识到触发器 'should' 会处理任何记录并强制此字段永远不会为 NULL。只是由于某种原因无法添加约束让我感到不安。我需要放下这个烦恼吗?

感谢 Shawn 为我指出了一个简单易行的问题解决方案。在 SQLite 数据库中,为每条插入的记录插入当前 Date/Time 所需要做的就是将该列的默认值设置为 CURRENT_TIMESTAMP.

因为我想要我自己当地时间的时间戳,请参阅下面我创建的 table 脚本,它是我问题的解决方案。

CREATE TABLE outputLog (
    outputLog_ID INTEGER  PRIMARY KEY ASC ON CONFLICT ROLLBACK AUTOINCREMENT
                          NOT NULL ON CONFLICT ROLLBACK,
    outputLog    TEXT,
    created      DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime') ) 
                          NOT NULL )
;