Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在创建表列时,如何正确使用更新当前_时间戳?_Python_Sqlite - Fatal编程技术网

Python 在创建表列时,如何正确使用更新当前_时间戳?

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”时,它应该在表中创建以下条目: |--------

我是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>  |
|---------------------|------------------|
我尝试过稍微修改一下列定义,我发现如果我删除更新当前时间戳上的
部分,那么它就是
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 view
    sqlite\u master
    以列出所有现有触发器,如
    select*from sqlite\u master,其中type='trigger'。(2) 这只会更新刚刚更新的行(前提是您有一个主键,如我在回答中所解释的)。感谢快速响应人员,有没有办法检查我是否已经创建了此触发器,这样我就不会继续将其重新添加到数据库中?或者这是我不必担心的事情?我担心的是,如果这个语句被多次执行,它将创建重复的触发器,所有这些触发器都会执行相同的操作,我认为这会导致性能问题。另一个问题是,您的SQL语句会更新所有行上最新更新的列还是只更新已更改的列?@domsteek:(1)您可以查询catalog view
    sqlite\u master
    以列出所有现有触发器,如
    select*from sqlite\u master,其中type='trigger'。(2) 这只会更新刚刚更新的行(前提是您有一个主键,如我在回答中所解释的)。