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

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

我已经在Oracle中创建并使用了Triggers多年,但是当我将数据插入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进行了一些修改。逻辑基本相同。

我错过了什么?

后来编辑 - 如果我改为使用AFTER INSERT而不使用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约束。也许我已经习惯了多年来我在甲骨文中的表现?我意识到Trigger'应该'处理任何记录并强制该字段永远不为NULL。只是因为某种原因无法添加约束让我感到不安。我需要放下这种担心吗?

sqlite default-value database-trigger
1个回答
0
投票

感谢Shawn指点我简单解决我的问题。在SQLite数据库中为插入每个记录插入当前日期/时间所需的只是将该列的DEFAULT值设置为CURRENT_TIMESTAMP

因为我想在我当地时间的时间戳,请看下面我的创建表脚本,这是我的问题的解决方案。

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 )
;
© www.soinside.com 2019 - 2024. All rights reserved.