MySQL триггер нуждается в настройке - PullRequest
0 голосов
/ 07 августа 2011

У меня есть триггер, который устанавливает поле даты и времени в строке таблицы при вставке новой строки. (Не рассказывайте мне, что я могу сделать это в определении таблицы, у меня есть второе поле 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 требовалась внутренняя точка с запятой.

1 Ответ

1 голос
/ 07 августа 2011

Тест для NEW.created равен NULL, если он установлен, потому что вы установили его в своем операторе вставки, если он равен NULL, ему нужно текущее время в качестве значения, что-то вроде этого поможет:*

if NEW.created is NULL THEN
   SET NEW.created = now();
end if
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...