我正在尝试使用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))
答案 0 :(得分:1)
看起来SQLite在DELETE
上执行了INSERT
然后REPLACE
:
更换
发生UNIQUE约束违规时,REPLACE algorithm删除导致该行的预先存在的行 约束违规 在插入或更新当前行和命令之前 继续正常执行。如果违反NOT NULL约束 发生时,REPLACE冲突解决方案用NULL替换NULL值 该列的默认值,或者该列没有默认值 值,然后使用ABORT算法。如果是CHECK约束 发生违规,REPLACE冲突解决算法总是如此 就像ABORT一样。