私はSqlite3 REPLACE(INSERT OR REPLACE)コマンドを試しています。私は作成されたdatetime(creDT)と更新日時(updDT)を保つのが好きです。そこで、INSERT(creDT & updDT)とUPDATE(updDT)のためのデータベースとトリガーを作成しましたが、それぞれのREPLACE(主キーが存在するもの)はcreDTとupdDTの両方で現在時刻を返します。 UPPLATEの代わりにREPLACE DELETEとINSERTを実行しますか?レコードが既に存在する場合でもSqlite3 INSERTトリガのみがREPLACE文で起動しますか?
これは標準的な動作ですか、何か間違っていますか? SQLiteのがREPLACE
に次にDELETE
INSERT
を行うよう
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))
私のテストから、REPLACEコマンドはレコードがすでに存在していたときにDELETEトリガがexcudedされていない、INSERTトリガーを実行 –