Python 在创建表列时,如何正确使用更新当前_时间戳?
我是SQL的新手,我发现在创建一个包含列的表时,只要使用以下命令更新列(这正是我想要的),我就可以自动将列更新为当前时间戳:Python 在创建表列时,如何正确使用更新当前_时间戳?,python,sqlite,Python,Sqlite,我是SQL的新手,我发现在创建一个包含列的表时,只要使用以下命令更新列(这正是我想要的),我就可以自动将列更新为当前时间戳: CREATE TABLE IF NOT EXISTS Foo ( Symbol CHAR(5), LastUpdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) 因此,根据我的理解,当我在这个表中插入一个符号,例如“Baz”时,它应该在表中创建以下条目: |--------
CREATE TABLE IF NOT EXISTS Foo (
Symbol CHAR(5),
LastUpdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
因此,根据我的理解,当我在这个表中插入一个符号,例如“Baz”时,它应该在表中创建以下条目:
|---------------------|------------------|
| Symbol | LastUpdated |
|---------------------|------------------|
| Baz | <current time> |
|---------------------|------------------|
我尝试过稍微修改一下列定义,我发现如果我删除更新当前时间戳上的部分,那么它就是lastUpdateTime DEFAULT CURRENT\u TIMESTAMP
,查询就会执行得很好,但问题是,我仍然希望它在更新行时自动更新其LastUpdated列。我看到我可以使用某种代码,它看起来像是触发了一个事件,当我的行被更新时,它会更新一个列,但我不确定它为什么会工作,或者为什么我应该在我想工作的代码段上使用它。理想情况下,我希望updatecurrent_TIMESTAMP上的部分以某种方式工作,而不是在另一个StackOverflow问题上添加该用户提供的代码
所以我有两个问题:
为什么尽管从源复制/粘贴了更新部件,但仍会收到该部件的错误
如何正确地使一行在每次更新该行时自动更新其LastUpdated列
不幸的是,与MySQL不同,SQLite不支持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
不幸的是,与MySQL不同,SQLite不支持更新当前时间戳时的语法(我不确定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
感谢快速响应人员,有没有办法检查我是否已经创建了此触发器,这样我就不会一直将其重新添加到数据库中?或者这是我不必担心的事情?我担心的是,如果这个语句被多次执行,它将创建重复的触发器,所有这些触发器都会执行相同的操作,我认为这会导致性能问题。另一个问题是,您的SQL语句会更新所有行上最新更新的列还是只更新已更改的列?@domsteek:(1)您可以查询catalog viewsqlite\u master
以列出所有现有触发器,如select*from sqlite\u master,其中type='trigger'代码>。(2) 这只会更新刚刚更新的行(前提是您有一个主键,如我在回答中所解释的)。感谢快速响应人员,有没有办法检查我是否已经创建了此触发器,这样我就不会继续将其重新添加到数据库中?或者这是我不必担心的事情?我担心的是,如果这个语句被多次执行,它将创建重复的触发器,所有这些触发器都会执行相同的操作,我认为这会导致性能问题。另一个问题是,您的SQL语句会更新所有行上最新更新的列还是只更新已更改的列?@domsteek:(1)您可以查询catalog viewsqlite\u master
以列出所有现有触发器,如select*from sqlite\u master,其中type='trigger'代码>。(2) 这只会更新刚刚更新的行(前提是您有一个主键,如我在回答中所解释的)。