Сегодня интересная статья: Триггеры в MYSQL: разбираемся с BEFORE Insert.

Что такое триггеры? Это процедуры, которые записаны в самой базе данных, и запускаются при заданных условиях. В таких процедурах можно модифицировать поля в таблицах, изменять вводимые данные, а условиями запуска могут быть различные факторы: добавления данных, изменение данных, удаление данных и т.д.

Не сложно догадаться для чего вообще можно использовать триггеры в базах данных, спектр применения очень широк: обновление суммы товаров в заказе, при изменении количества, удаление всех записей пользователя после удаления самого пользователя и т.д.

Сегодня рассмотрим триггер Before insert. Он срабатывает всякий раз, когда в определённую таблицу вставляется новая строка, вернее как раз перед тем, как она будет добавлена.

В этом триггере можно изменить входящую информацию, например, на вход пришло количество товара в корзине, и при помощи триггера можно рассчитать сумарную стоимость заказа.

Внутри этого триггера есть переменная NEW, в которой хранится вся строка, которая будет вставлена, именно её и будем модифицировать и использовать в таком виде: NEW.imya_polya=’new value’.

А вот и пример триггера BEFORE INSERT:

CREATE TRIGGER contacts_before_insert
BEFORE INSERT
   ON contacts FOR EACH ROW

BEGIN

   DECLARE vUser varchar(50);

   -- Find username of person performing INSERT into table
   SELECT USER() INTO vUser;

   -- Update create_date field to current system date
   SET NEW.created_date = SYSDATE();

   -- Update created_by field to the username of the person performing the INSERT
   SET NEW.created_by = vUser;

END; //

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

CREATE TRIGGER products_before_insert
BEFORE INSERT
   ON products FOR EACH ROW

BEGIN

UPDATE totals_table SET total=(SELECT SUM(subtotal) as t FROM products WHERE id_totals_table=NEW.id_totals_table) WHERE id_totals_table=NEW.id_totals_table

END; //

Думаю, что вопросы остались, поэтому пишите их в комментарии.