如何使用触发器

时间:2019-02-27 18:20:07

标签: sqlite default-value database-trigger

我已经在Oracle中创建触发器并与之合作了多年,但是当将数据插入sqlite数据库时,我无法全神贯注于如何更新字段。

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

实现此目标的最佳方法是什么?

以下是我尝试失败的尝试。

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约束。也许我只是习惯于在甲骨文工作多年了?我意识到触发器“应该”处理所有记录,并强制将此字段设置为NEVER不能为NULL。只是由于某种原因无法添加约束使我感到不安。我需要放开这个烦恼吗?

1 个答案:

答案 0 :(得分:0)

感谢肖恩(Shawn)向我指出了解决我的问题的简单方法。在SQLite数据库中,为要插入的每个记录插入当前日期/时间所需要做的就是将该列的DEFAULT值设置为CURRENT_TIMESTAMP

由于我希望使用自己的本地时间作为时间戳记,因此请参阅下面的create 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 )
;