SQLite 3.8时间戳更新触发器问题

时间:2015-04-17 08:04:57

标签: sqlite python-3.x sqlitestudio

我刚刚开始使用SQLite Studio 3.0.5,只是为了尝试一下,我现在已经使用了SQLiteSPY 1.9.6,几乎没有任何问题。

这是一个简单的字典表,有两个完美执行的触发器。

CREATE TABLE IF NOT EXISTS tbl_english_dictionary (
word_id INTEGER PRIMARY KEY AUTOINCREMENT,
word VARCHAR(50),
definition TEXT,
notes TEXT,
lm_datetime TEXT);

CREATE TRIGGER insert_tbl_english_dictionary AFTER INSERT ON tbl_english_dictionary
BEGIN
    UPDATE tbl_english_dictionary SET lm_datetime = datetime('now', 'localtime')
    WHERE rowid = new.rowid;
END;

CREATE TRIGGER update_tbl_english_dictionary BEFORE UPDATE ON tbl_english_dictionary
BEGIN
    UPDATE tbl_english_dictionary SET lm_datetime = datetime('now', 'localtime')
    WHERE rowid = new.rowid;
END; 

在SQLiteSPY中执行更新时,它可以正常工作,我会看到新数据和更新的时间戳。

在SQLiteStudio中执行更新时...我得到:'触发器递归的级别太多'

所以我去搜索并找到了一些关于更改触发器代码的建议,例如添加......:WHEN NEW.lm_datetime< OLD.lm_datetime在前置条件中如下:

CREATE TRIGGER update_tbl_system_messages
    BEFORE UPDATE
        ON tbl_system_messages
  FOR EACH ROW
      WHEN NEW.lm_datetime < OLD.lm_datetime
BEGIN
   UPDATE tbl_system_messages
      SET lm_datetime = datetime('now', 'localtime') 
    WHERE message_id = OLD.message_id;
END;

我尝试过编辑

中的SET语句
SET lm_datetime = datetime('now', 'localtime') 

SET lm_datetime = CURRENT_TIMESTAMP;

我注意到通过添加前置条件语句我能够停止递归错误,我的更新发生了......但是时间戳字段没有得到更新......好像触发器是不存在的。< / p>

数据库文件实际上是由python脚本创建的,我正在运行python 3.4

SQLite Studio向我显示我的数据库版本是:3.8.7.4 SQLiteSPY向我显示我的数据库版本是:3.8.0.2

我甚至没有进入那个......但是如果有人对这个更新触发器有任何想法我都是耳朵。

我可以简单地说......如果它没有被破坏,就不要修复它......因为它在SQLiteSPY中工作没有问题....但是解决这个问题会很好。< / p>

谢谢。

1 个答案:

答案 0 :(得分:1)

更新时间戳列时,您不希望运行UPDATE触发器,因此应将触发器限制为其他列:

CREATE TRIGGER ...
AFTER UPDATE OF word, definition, notes ON tbl_english_dictionary
BEGIN ...