首页 > 解决方案 > 提交插入语句后如何编写 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_dateedit_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 语句之后自动提交时间?

标签: sqlsqlitetriggers

解决方案


根据sqlite3 日期和时间函数 doc

日期和时间函数的 'now' 参数对于同一个sqlite3_step()调用中的多个调用总是返回完全相同的值。

一种可能的解决方案:

  • 将触发器更改为AFTER UPDATE
  • 插入一个“空白”行
  • 更新WHERE entry_id = last_insert_rowid()并进行编辑

推荐阅读