Mysql: обновление триггером своей же таблицы

286
21 декабря 2016, 02:22

У меня есть таблица с платежами, где помимо суммы платежа хранится баланс человека на момент платежа. Я хотел с помощью триггера 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

Но соответственно возникает ошибка, что триггер не может работать с таблицей, с которой он ассоциирован.

Как можно поступить в таком случае? Реализовывать все не в БД, отдельным запросом?

Answer 1

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

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;

Ну и неплохо бы всё это в транзакцию завернуть - а ну как не пройдёт какое действие...

READ ALSO
Не выводиться информация

Не выводиться информация

Не выводиться никакой информации(ошибок тоже нет), хотя таблица не не пустая

246
mysql_fetch_array() expects parameter 1 to be resource (or mysqli_result), boolean given

mysql_fetch_array() expects parameter 1 to be resource (or mysqli_result), boolean given

Я пытаюсь получить данные из таблицы MySQL, но вылезает одна из этих ошибок:

426
Подключение к БД средствами Spring с указанием кодировки сессии

Подключение к БД средствами Spring с указанием кодировки сессии

Дело в том, что развернув приложение на хостинге столкнулся с проблемой кодировки, везде использую UTF-8, отследил весь путь и выявил, что с контролёра...

298