Ошибка Mysql 1442 при запуске действия для обновления двух столбцов после вставки строки

#mysql #database-trigger

#mysql #триггер базы данных

Вопрос:

После вставки данных, например, даты в event_date столбец, я хочу, чтобы триггер обновлял два столбца той же таблицы и строил соответствующие значения ‘event_quarter’ и ‘event_year’.

У меня есть этот тест table с четырьмя столбцами:

id , event_date , event_quarter , event_year

Я боролся с этим кодом, чтобы заставить его работать:

 DELIMITER $$

CREATE TRIGGER `fill_event_quarter_and_year`
   AFTER INSERT
   ON `test_table`
   FOR EACH ROW
BEGIN
   DECLARE event_date_   DATE;

   SELECT event_date
     INTO event_date_
     FROM `test_table`
    WHERE NEW.id = id;

   UPDATE `test_table`
      SET event_quarter = QUARTER(event_date_), event_year = YEAR(event_date_)
    WHERE NEW.id = id;
END
$$  
  

Однако я получаю следующую ошибку:

1442 — Не удается обновить таблицу ‘test_table’ в сохраненной функции / триггере, поскольку она уже используется оператором, который вызвал это сохраненное

функция / триггер

Как мне это исправить?

Тогда, похоже, мне нужно создать два триггера, один для этого INSERT действия ввода, а другой для UPDATE действия ввода. Верно? Как это будет при обновлении определенной строки или записи?

Или это возможно триггер как для обновления, так и для вставки действий?

Ответ №1:

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

Эта строка обозначается как new , и вы можете читать и записывать в нее, но вы должны использовать синтаксис set new.columnname = ... , без update . Это должно быть сделано в a before -trigger .

Вы не можете комбинировать триггеры для update и insert , поэтому вам нужно создать два, но вы можете использовать один и тот же код для обоих:

 CREATE TRIGGER `trbins_fill_event_quarter_and_year`
BEFORE INSERT ON `test_table`
FOR EACH ROW
  set new.event_quarter = QUARTER(new.event_date), 
      new.event_year = YEAR(new.event_date);

CREATE TRIGGER `trbupd_fill_event_quarter_and_year`
BEFORE UPDATE ON `test_table`
FOR EACH ROW
  set new.event_quarter = QUARTER(new.event_date), 
      new.event_year = YEAR(new.event_date);