Я создавал триггеры в Oracle и работал с ними в течение многих лет, однако я не могу понять, как обновить поле при вставке данных в базу данных sqlite.
Все, что я хочу сделать, это создать триггер, который автоматически вставляет текущий DateTime в столбец базы данных sqlite с именем createdDate для ЛЮБОЙ вставленной записи.
Как лучше всего этого добиться?
Ниже описано то, что я безуспешно пытался.
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 для столбца createdDate. Возможно, я просто привык к тому, как много лет делал это в Oracle? Я понимаю, что триггер «должен» заботиться о любой записи и заставлять это поле НИКОГДА не быть NULL. Просто НЕЛЬЗЯ добавить ограничение по какой-то причине меня беспокоит. Мне нужно избавиться от этого беспокойства?
DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime') )
- person Code Novice   schedule 28.02.2019