При создании триггера, когда значение равно NULL, используйте старое значение.Ошибка вложенного исключения - PullRequest
0 голосов
/ 08 декабря 2018

Здравствуйте, и спасибо за просмотр, у меня есть таблица (с именами, измененными с настоящих имен, и некоторая другая информация не указана, пожалуйста, дайте мне знать, есть ли какая-либо дополнительная информация о таблице, которую вы хотите)

CREATE TABLE IF NOT EXISTS `example`.`coursetwo` (
  `candidate_no` INT(11) NOT NULL,
  `course_date` DATETIME NULL,
  `course_name` VARCHAR(45) NULL,
  PRIMARY KEY (`candidate_no`),
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

И у меня есть запрос на обновление формы, которая обновляет дату и имя курса таблицы для кандидата.Вот запрос:

UPDATE coursetwo SET course_date=?, course_name=? WHERE candidate_no = ?;

Когда пользователь хочет вернуться назад и ввести только одно значение, например, имя_курса и отправить его, он устанавливает нулевую дату курса и не сохраняет предыдущий известный ввод.

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

Произошла непредвиденная ошибка (тип = Внутренний серверОшибка, статус = 500).PreparedStatementCallback;без категории SQLException для SQL [ОБНОВЛЕНИЕ coursetwo SET course_date = ?, course_name =?ГДЕ кандидат_ = =];Состояние SQL [HY000];код ошибки [1442];Невозможно обновить таблицу 'coursetwo' в сохраненной функции / триггере, потому что она уже используется оператором, который вызвал эту сохраненную функцию / триггер;nested ...

Вот мой триггер:

delimiter #
DROP TRIGGER IF EXISTS ifnull_keep_old_values# 
create trigger ifnull_keep_old_values after update on coursetwo
for each row
begin
    IF NEW.course_date IS NULL THEN
    UPDATE example
    SET course_date = OLD.course_date WHERE candidate_no = OLD.candidate_no;
    END IF;
END#
DELIMITER ;

Кто-нибудь знает, что с этим не так, и есть ли другая работа вокруг?У меня есть много таблиц и столбцов, которые нужно изменить, и мне придется делать этот триггер примерно 50 раз для каждой (очень плохо!).Я не очень разбираюсь в триггерах, поэтому любая помощь будет отличной!

Спасибо, что нашли время, чтобы прочитать и помочь мне:)

1 Ответ

0 голосов
/ 08 декабря 2018

Таким образом, вы хотите сохранить текущее значение course_date, когда произойдет обновление, которое установит его на NULL.

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

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

Как:

delimiter #
DROP TRIGGER IF EXISTS ifnull_keep_old_values# 
CREATE TRIGGER ifnull_keep_old_values BEFORE UPDATE ON coursetwo
FOR EACH ROW
BEGIN
    IF NEW.course_date IS NULL THEN SET NEW.course_date = OLD.course_date;
    END IF;
END#
DELIMITER;

Если вы хотите иметь дело с большим количеством столбцов в одной таблице, сделайте это в одном и том же триггере.Вам просто нужно добавить дополнительные пункты IF NEW.... IS NULL THEN NEW... = OLD....Если вы хотите реализовать ту же логику в других таблицах, то вы должны создать новый триггер для каждой таблицы.

Вот альтернативное тело для триггера, которое избегает использования блока BEGIN/END.Функция COALESCE возвращает свой первый аргумент (здесь новая дата курса), если это не NULL, и в этом случае возвращается второй аргумент (старая дата курса).

CREATE TRIGGER ifnull_keep_old_values BEFORE UPDATE ON coursetwo
FOR EACH ROW
    SET NEW.course_date = COALESCE(NEW.course_date, OLD.course_date)
; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...