Триггер MYSQL, выдающий ошибки - PullRequest
0 голосов
/ 29 апреля 2018

Таблица счетов: введите описание изображения здесь

MYSQL терминал: введите описание изображения здесь

Я создаю триггер для таблицы «Счета», который будет реагировать на любое обновление или вставку в базу данных, которая даст типу счета любое значение, кроме кредита, чека или наличных денег.

Я пытался реализовать триггер (он скомпилирован), но он выдает мне ошибку всякий раз, когда я пытаюсь добавить что-то, кроме наличных, кредита и чека. Что может вызвать / исправить эту ошибку?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Сообщение об ошибке довольно очевидно. TRIGGER запрещено изменять таблицу, с которой сработал триггер.

Ограничение задокументировано в Справочном руководстве MySQL

https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html

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


В триггерах BEFORE INSERT и BEFORE UPDATE мы можем назначать значения столбцам вставляемой или обновляемой строки, ссылаясь на NEW.column_name

Например

 -- check if value assigned to `col` is valid
 IF NEW.col IN ('cash','checking','credit') THEN
    -- it is valid, so do nothing 
    DO 0;
 ELSE
   -- value isn't valid, so override the provided value
   SET NEW.col = 'cash';
 END IF;

Пустой блок BEGIN END предпочтительнее оператора DO 0;. Кроме того, обязательно ожидайте значения NULL и убедитесь, что они обрабатываются надлежащим образом. (Обратите внимание, что сравнение «не равно» с NULL вернет NULL, не true или false.)

 -- check if value assigned to `col` is valid
 IF NEW.col IN ('cash','checking','credit') THEN
    -- it is valid, so do nothing 
    BEGIN END;
 ELSE
   -- value isn't valid, so override the provided value
   SET NEW.col = 'cash';
 END IF;
0 голосов
/ 29 апреля 2018

Вместо выполнения insert замените значение OLD столбца новым требуемым значением, установив свойство NEW:

IF OLD.type <> 'cash' and OLD.type <> 'credit' and OLD.type <> 'checking' THEN
    SET NEW.type = 'cash'
END IF;

Переопределенное значение, сохраненное в NEW.type, будет вставлено в таблицу после завершения триггера.

...