Триггер подсчета баланса в MySQL

Здесь мы рассмотрим как нужно создавать триггеры записей в MySQL. Триггер - хранимая процедура вызываемая при наступлении определенного события. В частности триггер записи (строки таблицы) бывает трех видов: триггер добавления, триггер обновления и триггер удаления. Каждый из этих трех видов может вызываться до или после указанной операции над строками таблицы. В прошлой заметке уже описывался триггер и был выложен скрипт. Здесь же я хочу помочь в его переделке на тот случай если ваша БД отличается. Вот сам скрипт с коментариями:

DELIMITER $$

/* Вместо acc_id нужно поставить поле внешнего ключа, указывающее на id счета в таблице операций */
/* Вместо <название таблицы операций>, <название таблицы счетов>, <поле суммы операции>, <поле баланс счета>
необходимо указать соответствующие названия из вашей базы данных */
DROP TRIGGER IF EXISTS operation_bu$$ /* удаляем триггер, если это не первая попытка и он уже есть*/

CREATE TRIGGER operation_bu BEFORE UPDATE ON `<название таблицы операций>` /*триггер обновления, вызывается перед обновлением записи*/
FOR EACH ROW
BEGIN
IF OLD.<поле суммы операции> <> NEW.<поле суммы операции> THEN
UPDATE <название таблицы счетов> as acc
SET acc.<поле баланс счета> = acc.<поле баланс счета> + NEW.<поле суммы операции> - OLD.<поле суммы операции>
WHERE acc.id = NEW.acc_id;
END IF;
END$$

DROP TRIGGER IF EXISTS operation_bi$$

CREATE TRIGGER operation_bi BEFORE INSERT ON `<название таблицы операций>` /*триггер до вставки записи*/
FOR EACH ROW
BEGIN
UPDATE <название таблицы счетов> as acc
SET acc.<поле баланс счета> = acc.<поле баланс счета> + NEW.<поле суммы операции>
WHERE acc.id = NEW.acc_id;
END$$

DROP TRIGGER IF EXISTS operation_bd$$

CREATE TRIGGER operation_bd BEFORE DELETE ON `<название таблицы операций>` /*триггер до удаления*/
FOR EACH ROW
BEGIN
UPDATE <название таблицы счетов> as acc
SET acc.<поле баланс счета> = acc.<поле баланс счета> - OLD.<поле суммы операции>
WHERE acc.id = OLD.acc_id;
END$$

DELIMITER ;

Думаю вы обратили внимание, что в триггерах записей у нас есть старая и новая строки (OLD и NEW соответственно). Логично что при выполнении операции вставки у нас нет старой строки, а при удалении новой. Скачать этот шаблонный скрипт можно здесь. Скрипт нужно откорректировать и импортировать в phpmyadmin.

вернуться назад