У меня есть триггер, который устанавливает поле даты и времени в строке таблицы при вставке новой строки. (Не рассказывайте мне, что я могу сделать это в определении таблицы, у меня есть второе поле datetime, которое уже использует эту функциональность, и вы можете сделать это только с одним столбцом на таблицу.)
Этот триггер отлично подходит для моих целей:
CREATE TRIGGER foobar_insert
BEFORE INSERT ON foobar
FOR EACH ROW SET NEW.created=NOW();
Таким образом, всякий раз, когда вставляется новая строка, foobar.created
устанавливается на текущее время. Это здорово, когда я делаю что-то вроде:
INSERT INTO foobar (foo) VALUES ('bar');
Единственная проблема с этим заключается в том, что если я хочу явно указать foobar.created
в операторе вставки, он будет переопределен триггером.
Итак,
INSERT INTO foobar (foo, созданный) VALUES ('foo', '2006-01-01 12:12:12');
приводит к foobar.created
, равному времени вставки, а не времени, указанному в операторе вставки.
Итак, мой вопрос: как я могу изменить свой триггер на установку foobar.created
, только если у него еще нет значения?
EDIT:
В ответ на james_bond ниже, вот что сработало:
DELIMITER $$
DROP TRIGGER IF EXISTS foobar_insert$$
CREATE TRIGGER foobar_insert
BEFORE INSERT ON foobar
FOR EACH ROW
IF NEW.created IS NULL THEN
SET NEW.created=NOW();
END IF$$
DELIMITER ;
Примечание. Я должен был включить операторы DELIMITER
, поскольку для оператора IF
требовалась внутренняя точка с запятой.