我已经在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。只是由于某种原因无法添加约束使我感到不安。我需要放开这个烦恼吗?
答案 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 )
;