Блог

ТРИГГЕРЫ В MYSQL

  • 06.07.2016
  • scion

Триггер — это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а она  вызываетьтся сама исполнением некоторых событий, таких как:  вставка,удаление, обновление данных в строке.
поддерживаеться в  MySQL > 5.0.2

Синтаксис:

CREATE TRIGGER name_trigger time_trigger event_trigger

ON name_tbl FOR EACH ROW trigger_expr                 

 

name_trigger - Имя триггера в таблице должно быть уникальным

time_trigger - Запуск триггера(BEFORE — перед событием, AFTER — после события)

event_trigger - Событие

/* Возможные события

insert — событие вызывается операторами insert, data load, replace

update — событие вызывается оператором update

delete  событие вызывается операторами delete, replace

name_tbl - Имя таблицы

trigger_expr - Выражения триггера, то есть действие которое вызывает SQL- запрос, так же возможны логические выражения

Пример использования

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

DELIMITER //                                                  
CREATE TRIGGER `insert_left_menu` AFTER INSERT ON `categories`
FOR EACH ROW                                                  
INSERT INTO `left_menu` SET uri=NEW.id, id_category = NEW.id,name = NEW.name,status=NEW.status;
DELIMITER ;                                                   

 

Прошу обратить внимание на псевдоним NEW (это означает, что выбирается поле, после чего оно модифицируется или удалится,так же может иметь место  псевдоним OLD, что значит поле до действий). По идее это обычный sql- запрос, не забудьте поставить " ; "  в конце запроса(не в конце триггера, а именно запроса).

Но представьте, что перед тем как выполнить запрос, Вам нужно проверить входные данные. Для это вы можете использовать логические выражения.

DELIMITER //                                                  
CREATE TRIGGER `insert_left_menu` AFTER INSERT ON `categories`
FOR EACH ROW IF(NEW.id_category IS NULL)                      
THEN                                                          
INSERT INTO `left_menu` SET uri=NEW.id, id_category = NEW.id,name = NEW.name,status=NEW.status;
END IF                                                        
DELIMITER ;

 

IF(NEW.id_category IS NULL) - логическое выражение,после него обязательно идет команда THEN(тогда) и только после THEN идет действие.

END IF - окончание логического выражения.

DELIMITER // - это изменение разделителя

Так же возможно работать с переменными. Объявление переменной.

set@count =1;                                      

 

Удаление триггера

DROP TRIGGER IF EXISTS `insert_left_menu` ;               

 

Обновлять триггеры нельзя, только удалять и создавать новые.