创建表列时如何正确使用 ON UPDATE CURRENT_TIMESTAMP?



我是SQL的新手,我看到在创建带有列的表时,每当列更新时,我都可以自动将列更新为当前时间戳(这正是我想要的(如下:

CREATE TABLE IF NOT EXISTS Foo (
Symbol CHAR(5),
LastUpdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

因此,根据我的理解,当我在此表中插入符号(例如"Baz"(时,它应该在表中创建以下条目:

|---------------------|------------------|
|        Symbol       |    LastUpdated   |
|---------------------|------------------|
|         Baz         |  <current time>  |
|---------------------|------------------|

如果我将符号从"Baz"更新为"Qux",则该行的"上次更新"列应更改为新的当前日期时间。但是,当我使用 sqlite3 模块在 python 中运行该查询时,出现以下错误:sqlite3.OperationalError: near "ON": syntax error.以下是代码在 Python 中的样子:

self.__conn = sqlite3.connect(database_path)
self.__cursor = self.__conn.cursor()
self.__cursor.execute("""CREATE TABLE IF NOT EXISTS EQData (
Symbol CHAR(5),
LastUpdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)""")

我尝试稍微弄乱该列定义,我发现如果我删除ON UPDATE CURRENT_TIMESTAMP部分,那么它只是LastUpdated DATETIME DEFAULT CURRENT_TIMESTAMP查询将执行得很好,但问题是我仍然希望它自动更新其 LastUpdated 列每当该行更新时。我在这里看到我可以使用某种看起来像触发的事件的代码,当我的行更新时,它会更新一列,但我不确定它为什么有效或为什么我应该在我想要工作的代码段上使用它。理想情况下,我只是希望ON UPDATE CURRENT_TIMESTAMP部分以某种方式工作,而不是在其他 StackOverflow 问题中添加该用户提供的代码。

所以我有两个问题:

  1. 为什么尽管从源复制/粘贴了 ON UPDATE 部分,但我会收到错误?
  2. 如何正确获取行以在每次更新行时自动更新其"上次更新"列?

不幸的是,与MySQL不同,SQLite不支持ON UPDATE CURRENT_TIMESTAMP语法(我不确定MySQL是否实际提供该功能的任何其他数据库(。

解决此问题的一种方法是使用触发器。假设表的主键是id,那就是:

CREATE TRIGGER Trg_LastUpdated
AFTER UPDATE ON Foo
FOR EACH ROW
BEGIN
UPDATE Foo SET LastUpdated = CURRENT_TIMESTAMP WHERE id = OLD.id;
END

DB小提琴上的演示

相关内容

最新更新