sql - 提交插入语句后如何编写 SQLite 触发器以获取时间戳
问题描述
我建立了一个 SQLite 数据库来存储手写文本笔记,使用这个表:
CREATE TABLE Journal (
entry_id INTEGER PRIMARY KEY AUTOINCREMENT,
create_date TEXT DEFAULT (datetime()),
edit_date TEXT,
entry_text TEXT NOT NULL
);
我使用edit() 函数使用 sqlite3 CLI 以交互方式输入文本记录。它打开一个文本编辑器,我输入我的内容,关闭编辑器后,内容将被提交:
sqlite> insert into Journal (entry_text) values(edit('','nano'));
我还创建了一个触发器,它应该在我完成输入并关闭编辑器后保存编辑日期和时间。使用这种方法,人们可以推断写每个条目需要多长时间。但是在编辑完成并将文本插入表格后,我很难获得正确的时间戳。
这是这种不起作用的方法,导致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 语句之后自动提交时间?
解决方案
日期和时间函数的 'now' 参数对于同一个sqlite3_step()调用中的多个调用总是返回完全相同的值。
一种可能的解决方案:
- 将触发器更改为
AFTER UPDATE
- 插入一个“空白”行
- 更新行
WHERE entry_id = last_insert_rowid()
并进行编辑
推荐阅读
- python - 神经结构化学习中的“对抗性扰动”是什么意思?
- javascript - 错误类型错误:无法在 Object.eval [as updateDirectives] 处读取 null 的属性“1”
- php - 为什么在这些 RewriteRules 下 `.htaccess` 会导致内部重定向溢出?
- c++ - 未找到 h264_cuvid 编解码器
- javascript - react-animation-components 包的问题
- flutter - 我可以在flutter bloc模式中使用多个存储库吗
- java - 在 windows docker 中运行 SWTBot 测试时 Eclipse(2019-09) 崩溃
- django - 添加新记录时更新其他模型字段
- docker - 如何在容器中获取 docker 版本?
- angular - 如何仅在 ionic 4 中删除网页版的页面转换?