#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);