如何使用触发器更新插入时的字段
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 )
;
多年来我一直在 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 usingFOR 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 )
;