MySQL: как создать триггер для установки даты создания новых строк - PullRequest
12 голосов
/ 25 мая 2010

Я столкнулся с проблемой при попытке создать два столбца TIMESTAMP в моей базе данных. Один называется created, а другой - updated. Я подумал, что было бы легко установить значение по умолчанию как CURRENT_TIMESTAMP, а затем ON UPDATE CURRENT_TIMESTAMP для столбца updated. Но по какой-то причине MySQL означает, что это плохая идея ... поэтому я искал способы сделать это без необходимости устанавливать один из них в запросе вставки.

Я нашел один способ, используя триггер в этом ответе , но я продолжаю получать ошибки. Мне просто удалось создать триггер, но теперь я получаю ошибки, когда пытаюсь вставить новые строки, утверждая, что

1442 - Невозможно обновить таблицу 'tasks' в сохраненной функции / триггере, поскольку она уже используется оператором, который вызвал эту сохраненную функцию / триггер.

И я совсем не понимаю, что это значит. Итак, я надеялся, что кто-то здесь сможет пролить свет на эту тему.

SQL, который я использовал для создания таблицы и триггера, выглядит следующим образом:

CREATE TABLE `tasks` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `created` DATETIME,
  `updated` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `title` VARCHAR(255) NOT NULL,
  `notes` TEXT,
  `status_id` INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`id`),
  KEY `status_id` (`status_id`),
  CONSTRAINT `fk_tasks_statuses` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TRIGGER task_creation_timestamp AFTER INSERT ON tasks 
FOR EACH ROW
UPDATE tasks SET created = updated WHERE id = NEW.id;

Что я здесь не так делаю?

1 Ответ

27 голосов
/ 25 мая 2010

Ваш триггер должен быть «перед вставкой», и вам нужно использовать SET вместо UPDATE:

CREATE TRIGGER task_creation_timestamp BEFORE INSERT ON tasks 
FOR EACH ROW
SET NEW.created = NOW();
...