Триггер Sqlite3 INSERT срабатывает только в операторе REPLACE, даже если запись уже существует? - PullRequest
2 голосов
/ 29 сентября 2011

Я пробую команду Sqlite3 REPLACE (INSERT OR REPLACE).Мне нравится сохранять созданный datetime (creDT) и update datetime (updDT).Поэтому я создал базу данных и триггер для INSERT (creDT & updDT) и одну для UPDATE (updDT), но каждый REPLACE (особенно тот, где первичный ключ уже существует) заканчивается текущим временем в creDT и updDT.ЗАМЕНИТЕ УДАЛИТЬ И ВСТАВИТЬ вместо ОБНОВЛЕНИЯ?

Это стандартное поведение или я что-то не так делаю?

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 Ответ

1 голос
/ 04 февраля 2014

Похоже, что SQLite выполняет DELETE, а затем INSERT на REPLACE:

REPLACE

Когда происходит нарушение ограничения UNIQUE, алгоритм REPLACE удаляет ранее существовавшиестроки, которые вызывают нарушение ограничения до вставки или обновления текущей строки, и команда продолжает выполняться нормально.Если происходит нарушение ограничения NOT NULL, разрешение конфликта REPLACE заменяет значение NULL значением по умолчанию для этого столбца или, если столбец не имеет значения по умолчанию, используется алгоритм ABORT.Если происходит нарушение ограничения CHECK, алгоритм разрешения конфликта REPLACE всегда работает как ABORT.

from: http://www.sqlite.org/lang_conflict.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...