即使记录已经存在,Sqlite3 INSERT触发器也只触发REPLACE语句?

时间:2011-09-29 19:14:48

标签: sqlite

我正在尝试使用Sqlite3 REPLACE(INSERT OR REPLACE)命令。我喜欢保留创建的日期时间(creDT)和更新日期时间(updDT)。所以我为INSERT(creDT& updDT)创建了一个数据库和一个触发器,为UPDATE(updDT)创建了一个触发器,但是每个REPLACE(尤其是主键已存在的那个)最终都是creDT和updDT中的当前时间。 REPLACE DELETE和INSERT而不是UPDATE吗?

这是标准行为还是我做错了什么?

def createDbTables(self):

    self.sqlCursor.execute("""
    CREATE TABLE rfdetector (
    sn TEXT PRIMARY KEY,
    detector TEXT,
    hex TEXT,
    updDT DATE,
    creDT DATE)
    """)

    self.sqlCursor.execute("""
    CREATE TRIGGER insert_rfdetector_creDT
    AFTER INSERT ON rfdetector
    BEGIN
    UPDATE rfdetector SET creDT = DATETIME('now','localtime') WHERE rowid = new.rowid;
    UPDATE rfdetector SET updDT = DATETIME('now','localtime') WHERE rowid = new.rowid;
    END;
    """)

    self.sqlCursor.execute("""
    CREATE TRIGGER update_rfdetector_updDT
    AFTER UPDATE ON rfdetector
    BEGIN
    UPDATE rfdetector SET updDT = DATETIME('now','localtime') WHERE rowid = new.rowid;
    END;
    """)

def insertSql(self, data):

    self.sqlCursor.execute(
    'REPLACE INTO rfdetector (sn, hex, detector) VALUES (?, ?, ?)',
    (data.serialNumber, data.hex, data.detector))

1 个答案:

答案 0 :(得分:1)

看起来SQLite在DELETE上执行了INSERT然后REPLACE

  

更换

     

发生UNIQUE约束违规时,REPLACE   algorithm删除导致该行的预先存在的行   约束违规   在插入或更新当前行和命令之前   继续正常执行。如果违反NOT NULL约束   发生时,REPLACE冲突解决方案用NULL替换NULL值   该列的默认值,或者该列没有默认值   值,然后使用ABORT算法。如果是CHECK约束   发生违规,REPLACE冲突解决算法总是如此   就像ABORT一样。

来自:http://www.sqlite.org/lang_conflict.html