Триггеры онлайн урок.


Триггеры - это специальные хранимые процедуры. Их особенность заключается в том, что они вызываются неявно, подобно магических функциям в PHP.

Триггер может быть вызван в зависимости от события, равноценного запросу UPDATE, INSERT, DELETE. Также, указывается когда именно сработает триггер, например

BEFORE INSERT – перед запросом INSERT.
AFTER INSERT– после запроса INSERT.

Аналогично можно указать и для остальных запросов:

BEFORE UPDATE, AFTER UPDATE, BEFORE DELETE, AFTER DELETE

Общая конструкция определения триггера выглядит так:

CREATE TRIGGER название время-вызова событие
ON таблицаFOR EACH ROW
BEGIN
тело
END;


Рассмотрим пример. Допустим, при появлении нового студента в группе, ему сразу необходимо назначить консультацию с преподавателем. Тогда событие - это INSERT, время вызова - AFTER, а таблица student.

DELIMITER $$
CREATE TRIGGER add_cons
AFTER INSERT ON student
FOR EACH ROW BEGIN
DECLARE last_id INT DEFAULT 0;
SELECT id INTO last_id
FROM student
ORDER BY id DESC LIMIT 1;

INSERT INTO student_teacher_consultation
VALUES (null, last_id, 1, NOW() + INTERVAL 1 DAY);
END $$

DELIMITER ;

Мы создали триггер, который добавляет новую запись в таблицу консультаций, назначая новому студенту консультацию на следующий день с преподавателем №1.

Проверим теперь, действительно ли это работает. Добавляем студента, и далее смотрим, что получилось в таблицах студентов и консультаций:

INSERT INTO student VALUES (null, 'Hank', 23, '231-14-33', 1);

Расписание консультаций:
+----+------------+------------+---------------------+
| id | student_id | teacher_id | consultation_date |
+----+------------+------------+---------------------+
| 1 | 1 | 2 | 2015-07-23 10:40:00 |
| 2 | 2 | 1 | 2015-07-17 12:10:00 |
| 3 | 5 | 1 | 2015-07-17 13:10:00 |
| 4 | 8 | 3 | 2015-07-27 14:15:00 |
| 5 | 6 | 3 | 2015-07-11 10:34:00 |
| 6 | 10 | 1 | 2015-07-09 15:48:15 |
+----+------------+------------+---------------------+

Список студентов:
+----+---------+------+-----------+----------+
| id | name | age | phone | group_id |
+----+---------+------+-----------+----------+
| 1 | Mike | 25 | 345-65-78 | 2 |
| 2 | John | 27 | 123-65-12 | 1 |
| 4 | Andy | 20 | 244-34-12 | 3 |
| 5 | Debra | 21 | 987-65-43 | 1 |
| 6 | Andy | 24 | 323-43-98 | 1 |
| 7 | Mike | 23 | 313-54-21 | 3 |
| 8 | Jeff | 25 | 213-56-23 | 2 |
| 9 | Stanley | 23 | 111-23-43 | 3 |
| 10 | Hank | 23 | 231-14-33 | 1 |
+----+---------+------+-----------+----------+