обновить столбец через триггер mysql
Есть 3 таблицы, задача обновить в таблице wallet столбец total, после того как будут добавлены значения в таблицу orders_tank_shop. Конкретнее надо вычесть из значения total столбец price из таблицы tank_shop.
p.s Чтобы добавить в таблицу orders_tank_shop значения order_id, оно соответственно должно быть добавлено и в таблицу orders, а только потом можно добавить заказ в orders_tank_shop.
Триггер срабатывает только 1 раз, и после insert в следующий раз ничего не меняется, но без триггера сам запрос работает.
DROP TABLE IF EXISTS tank_shop;
CREATE TABLE tank_shop(
id SERIAL PRIMARY KEY,
technics_id BIGINT unsigned COMMENT 'id танка',
ttc_id BIGINT unsigned COMMENT 'внешний ключ тактико технических характеристик',
price BIGINT(11) COMMENT 'Цена');
LOCK TABLES `tank_shop` WRITE;
INSERT INTO `tank_shop`(technics_id, ttc_id, price) VALUES
(4, 2, 2300);
UNLOCK TABLES;
DROP TABLE IF EXISTS orders;
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
account_id BIGINT unsigned COMMENT 'аккаунт',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата создания заказа',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Текущая дата',
-- FOREIGN KEY (account_id) REFERENCES accounts(id) ON UPDATE CASCADE ON DELETE CASCADE
) COMMENT = 'Заказы';
LOCK TABLES `orders` WRITE;
INSERT INTO `orders`(account_id) VALUES
(1),
(2),
(4);
UNLOCK TABLES;
DROP TABLE IF EXISTS orders_tank_shop;
CREATE TABLE orders_tank_shop(
id SERIAL PRIMARY KEY,
order_id BIGINT unsigned COMMENT 'id заказа внешний ключ',
tank_shop_id BIGINT unsigned COMMENT 'id товара в магазине',
UNIQUE INDEX idx_order_tnk_shop(order_id, tank_shop_id),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата создания заказа',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Текущая дата',
FOREIGN KEY (tank_shop_id) references tank_shop(id),
FOREIGN KEY (order_id) references orders(id)
) COMMENT = 'Состав заказа';
LOCK TABLES `orders_tank_shop` WRITE;
INSERT INTO `orders_tank_shop`(order_id, tank_shop_id) VALUES
(1, 1),
(2, 1),
(3, 1);
UNLOCK TABLES;
DROP TABLE IF EXISTS wallet;
CREATE TABLE wallet(
account_id BIGINT UNSIGNED NOT NULL UNIQUE ,
total decimal(11,4) COMMENT 'всего д/с',
-- FOREIGN KEY (account_id) REFERENCES accounts(id) ON UPDATE CASCADE ON DELETE cascade);
LOCK TABLES `wallet` WRITE;
INSERT INTO `wallet`(account_id, total) VALUES
(1, 4500),
(2, 6000),
(4, 7000),
(3, 5000),
(5, 10000),
(7, 20000);
UNLOCK TABLES; ```
-- ТРИГГЕР
DELIMITER //
CREATE TRIGGER total_wallet
after insert on orders_tank_shop
FOR each row
begin
update wallet
set total = total - (select price from tank_shop)
where account_id in (select account_id from orders where id = last_insert_id());
end//
DELIMITER ;