MySQL: Как создать триггер для установки даты создания для новых строк

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

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

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

И я не получаю то, что это означает вообще. Так, я надеялся, что кто-то здесь мог пролить некоторый свет этот предмет.

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;

Что я делаю неправильно здесь?

12
задан Community 23 May 2017 в 11:53
поделиться

1 ответ

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

CREATE TRIGGER task_creation_timestamp BEFORE INSERT ON tasks 
FOR EACH ROW
SET NEW.created = NOW();
27
ответ дан 2 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: