2011-09-29 10 views
2

私は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に次にDELETEINSERTを行うよう

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

が見える:

UNIQUE制約違反が発生した場合

をREPLACE、REPLACE アルゴリズムは を引き起こしている既存の行を削除します現在の行を挿入または更新する前に制約違反 が発生し、コマンド が正常に実行され続けます。 NOT NULL制約違反 が発生した場合、REPLACE競合解決によってNULL値が でその列のデフォルト値に置き換えられます。または列にデフォルトの 値がない場合は、ABORTアルゴリズムが使用されます。 CHECK制約 違反が発生した場合、REPLACE競合解消アルゴリズムは常に がABORTのように機能します。

から:http://www.sqlite.org/lang_conflict.html

+0

私のテストから、REPLACEコマンドはレコードがすでに存在していたときにDELETEトリガがexcudedされていない、INSERTトリガーを実行 –

関連する問題