Как обновить поля при вставке с помощью триггера - PullRequest
0 голосов
/ 27 февраля 2019

Я много лет создавал и работал с триггерами в Oracle, однако я не могу понять, как обновить поле при вставке данных в базу данных sqlite.

Все, что я хочу сделать, - этосоздайте триггер, который автоматически вставляет текущий DateTime в столбец базы данных sqlite с именем 'createDate' для ЛЮБОЙ вставляемой записи.

Каков наилучший подход для достижения этой цели?

Ниже приведено то, что я пытался безуспешно.

CREATE TRIGGER outputLogDB_Created_Trig
    BEFORE INSERT
        ON outputLog
      WHEN NEW.createdDate IS NULL
BEGIN
    SELECT CASE WHEN NEW.createdDate IS NULL THEN NEW.createdDate = datetime('now', 'localtime') END;
END;

Вышеприведенный пример является почти точной копией того, как я реализовал бы свои триггеры в Oracle с некоторыми изменениями, конечно, для sqlite.Логика в основном идентична.

Чего мне не хватает?

Позднее редактирование - я могу заставить его работать, если вместо этого использую AFTER INSERT, а не FOR EACH ROW

CREATE TRIGGER outputLog_Created_Trig
     AFTER INSERT
        ON outputLog
      WHEN New.createdDate IS NULL
BEGIN
    UPDATE outputLog
       SET createdDate = datetime('now', 'localtime') 
     WHERE outputLog_ID = New.rowid;
END;

Но почему я не могу просто вставить запись, используя новое значение, пока я ее вставляю?Могу ли я получить ТОЛЬКО с помощью обновления ПОСЛЕ того, как я уже вставил запись?

Проблема, с которой я столкнулся, заключается в том, что я хотел бы иметь ограничение NOT NULL для столбца createDate.Возможно, я просто привык к тому, как я делал это годами в Oracle?Я понимаю, что триггер «должен» позаботиться о любой записи и заставить это поле никогда не быть пустым.Просто то, что я НЕ могу добавить ограничение по какой-то причине, делает меня неловким.Мне нужно отпустить это беспокойство?

1 Ответ

0 голосов
/ 28 февраля 2019

Благодаря Шону указал мне на простое простое решение моей проблемы.Все, что требуется в базе данных SQLite для вставки текущей даты / времени для каждой вставляемой записи, - это установить для значения DEFAULT в этом столбце значение CURRENT_TIMESTAMP.

, поскольку я хотел указывать метку времени в своем собственном местном времени.см. ниже мой скрипт создания таблицы, который является решением моей проблемы.

CREATE TABLE outputLog (
    outputLog_ID INTEGER  PRIMARY KEY ASC ON CONFLICT ROLLBACK AUTOINCREMENT
                          NOT NULL ON CONFLICT ROLLBACK,
    outputLog    TEXT,
    created      DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime') ) 
                          NOT NULL )
;
...