У меня есть таблица с платежами, где помимо суммы платежа хранится баланс человека на момент платежа. Я хотел с помощью триггера mysql сделать следующее: при удалении платежа - баланс на начало последующих проводок уменьшался на сумму удаляемого платежа.
CREATE TRIGGER `before_delete_payment`
BEFORE DELETE ON `payment` FOR EACH ROW
BEGIN
UPDATE `payment` SET `value_before` = `value_before` - OLD.`amount`
WHERE `time` > OLD.`time`;
END
Но соответственно возникает ошибка, что триггер не может работать с таблицей, с которой он ассоциирован.
Как можно поступить в таком случае? Реализовывать все не в БД, отдельным запросом?
Выполняйте удаление платежа не простым запросом, а хранимой процедурой. А в ней реализуйте всю необходимую логику. Шаблонно:
CREATE PROCEDURE delete_payment(p_id bigint)
BEGIN
DECLARE p_time DATETIME;
DECLARE p_amount CURRENCY;
SELECT p.`time`, p.amount
INTO p_time, p_amount
FROM payment p
WHERE p.id = p_id;
UPDATE payment
SET value_before = value_before - p_amount
WHERE `time` > p_time;
DELETE FROM payment
WHERE `time` = p_time;
END;
Ну и неплохо бы всё это в транзакцию завернуть - а ну как не пройдёт какое действие...
Продвижение своими сайтами как стратегия роста и независимости