MySQL. Триггеры

Данная статья посвящена триггерам в MySQL и основана на официальной документации.

Триггер это именованный объект БД, ассоциированный с таблицей и который активируется при insert / update / delete. Причем активация может быть до события и после (before, after). Можно использовать триггеры для проверки значений, вставляемых в таблицу или проводить расчеты.

То есть мы можем создавать триггеры для следующих событий

Пример триггера из документации

Этот код выполнен в консоли о чем свидетельствует выражение “mysql>”.  Что собственно в этом коде происходит? А все очень просто – создается таблица, а в триггере объявляется аккумулирующее суммирование.

Символ @ перед переменной означает глобальную переменную. Её сервер mysql будет помнить после выхода из триггера и её же можно будет потом вызвать, например так

NEW означает, что мы берем новое значение, а не старое (для старого используется OLD, но в случае инструкции INSERT его и нет, об этом поговорим ниже)

FOR EACH ROW это что-то вроде цикла, то есть то, что идет до следующей точки с запятой будет повторяться для каждого ряда таблицы, к которой прикреплен триггер.

Далее, попробуем вставить данные и посмотреть что произошло.

Сервер произвел расчет примерно таким образом

Чтобы удалить триггер можно использовать следующую инструкцию

При удалении таблицы все триггеры, связанные с таблицей удаляются.

OLD and NEW

NEW эти данные только вошли.

OLD данные уже обработаны. Read-only.

Разберемся более внимательно с тем, что такое OLD and NEW. Эти инструкции позволяют получать доступ к колонкам с которыми работает триггер. Эти инструкции относятся исключительно к MySQL. Они не чувствительны к регистру.

В INSERT триггере, только NEW.col_name может быть использовано. Это и понятно, там OLD.col_name ещё и нет.

В DELETE триггере только OLD.col_name может быть использовано.

В UPDATE триггере можно использовать и то и другое.

Более детально можно посмотреть в документации

Следующий пример

Следующий пример позволяет создавать триггеры из нескольких инструкций. Все что нужно это заключить их в BEGIN… …END, а также объявить другой delimiter на время исполнения триггера.

Внутри триггера также можно вызвать хранимую процедуру при помощи метода CALL, но не возвращающую множество.

Также внутри триггера нельзя использовать транзакции.

Триггеры могут иметь прямые ссылки на таблицы, например таким образом

Теперь, допустим, мы произвели вставку данных таким образом

Результаты будут следующими

Таким образом, мы рассмотрели основные возможности триггеров.