如何编写 SQLite 触发器以在提交插入语句后获取时间戳
How to write SQLite trigger to get timestamp AFTER insert statement is committed
我建立了一个 SQLite 数据库来存储手写文本笔记,使用这个 table:
CREATE TABLE Journal (
entry_id INTEGER PRIMARY KEY AUTOINCREMENT,
create_date TEXT DEFAULT (datetime()),
edit_date TEXT,
entry_text TEXT NOT NULL
);
我使用 edit() function 使用 sqlite3 CLI 以交互方式输入文本记录。它打开一个文本编辑器,我输入我的内容,关闭编辑器后,内容将被提交:
sqlite> insert into Journal (entry_text) values(edit('','nano'));
我还创建了一个触发器,它应该在我完成输入并关闭编辑器后保存编辑日期和时间。使用这种方法,可以推断出编写每个条目需要多长时间。但我正在努力获得正确的时间戳 after 编辑完成并将文本插入 table.
这种方法不起作用,导致 create_date 和 edit_date 始终是相同:
CREATE TRIGGER change_edit_date AFTER INSERT ON Journal
BEGIN
UPDATE Journal SET edit_date = datetime() WHERE entry_id = new.entry_id;
END;
我假设在解析触发器时已经完成对 datetime() 的调用,而不是在我预期的插入操作之后。有谁知道如何更改它,即如何在 INSERT 语句之后自动提交时间?
根据sqlite3 date and time functions doc
The 'now' argument to date and time functions always returns exactly the same value for multiple invocations within the same sqlite3_step() call.
一个可能的解决方案:
- 将触发器更改为
AFTER UPDATE
- 插入一个“空白”行
- 更新行
WHERE entry_id = last_insert_rowid()
并进行编辑
我建立了一个 SQLite 数据库来存储手写文本笔记,使用这个 table:
CREATE TABLE Journal (
entry_id INTEGER PRIMARY KEY AUTOINCREMENT,
create_date TEXT DEFAULT (datetime()),
edit_date TEXT,
entry_text TEXT NOT NULL
);
我使用 edit() function 使用 sqlite3 CLI 以交互方式输入文本记录。它打开一个文本编辑器,我输入我的内容,关闭编辑器后,内容将被提交:
sqlite> insert into Journal (entry_text) values(edit('','nano'));
我还创建了一个触发器,它应该在我完成输入并关闭编辑器后保存编辑日期和时间。使用这种方法,可以推断出编写每个条目需要多长时间。但我正在努力获得正确的时间戳 after 编辑完成并将文本插入 table.
这种方法不起作用,导致 create_date 和 edit_date 始终是相同:
CREATE TRIGGER change_edit_date AFTER INSERT ON Journal
BEGIN
UPDATE Journal SET edit_date = datetime() WHERE entry_id = new.entry_id;
END;
我假设在解析触发器时已经完成对 datetime() 的调用,而不是在我预期的插入操作之后。有谁知道如何更改它,即如何在 INSERT 语句之后自动提交时间?
根据sqlite3 date and time functions doc
The 'now' argument to date and time functions always returns exactly the same value for multiple invocations within the same sqlite3_step() call.
一个可能的解决方案:
- 将触发器更改为
AFTER UPDATE
- 插入一个“空白”行
- 更新行
WHERE entry_id = last_insert_rowid()
并进行编辑