Проблемы с триггерами в MySQL - PullRequest
1 голос
/ 29 апреля 2020

Мне нужно создавать таблицы и триггеры для перемещения по банковскому счету. Я сделал несколько, но я застрял на балансе. У меня есть эти таблицы:

Здесь я просто вставляю информацию о транзакциях, в описании говорится, что я делаю (депозит 50, вывод 20 и т. Д. c.), D означает депозит и W означает снятие.

CREATE TABLE transactions
(account VARCHAR (10) NOT NULL,
date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP (),
description varchar (30) NOT NULL,
type ENUM ( 'D', 'W') NOT NULL,
value DECIMAL (7,2) NOT NULL
); 

Я сделал триггер, который сообщает, какие пользователи совершают транзакции, и другую информацию. Позже я обнаружил проблему.

У меня есть эта таблица, называемая балансом, где мне нужен номер счета и текущий баланс.

CREATE TABLE balance
(Account VARCHAR (10) PRIMARY KEY,
balance DECIMAL (7,2) default 0 NOT NULL 
);

Итак, я сделал следующий триггер, но он ничего не делает.

DELIMITER //
CREATE TRIGGER BALANCE_AI after insert on transactions for each row 
begin 
IF NEW.type = 'D' THEN UPDATE balance SET balance = balance + new.value WHERE account = new.account  ;
ELSE UPDATE balance set balance = balance - new.value where account = new.account;
end if;
end // 
DELIMITER ; 

Я не вижу, как я могу обновить баланс на определенном счете или вставить и обновить баланс в балансе таблицы.

Я также пробовал так:

CREATE TRIGGER balance_AI after insert on transactions for each row 
begin 
 UPDATE balance set balance = balance + new.valor where account = new.account;
 insert into balance values (new.account,balance) ON DUPLICATE key update account = account ;
end // 
DELIMITER ;

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете обновить только существующую строку - проверить, существует ли баланс, и создать, если его нет.

drop table if exists transactions,balance;

CREATE TABLE transactions
(account VARCHAR (10) NOT NULL,
date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP (),
description varchar (30) NOT NULL,
type ENUM ( 'D', 'W') NOT NULL,
value DECIMAL (7,2) NOT NULL
);

CREATE TABLE balance
(Account VARCHAR (10) PRIMARY KEY,
balance DECIMAL (7,2) NOT NULL
);

drop trigger if exists t;
DELIMITER //
CREATE TRIGGER t after insert on transactions for each row 
begin 
if not exists(select 1 from balance b where b.account = new.account) then
    insert into balance values (new.account,0);
end if;

IF NEW.type = 'D' THEN 
    UPDATE balance SET balance = balance + new.value WHERE account = new.account  ;
ELSE 
    UPDATE balance set balance = balance - new.value where account = new.account;
end if;
end // 
DELIMITER ; 

insert into transactions (account,description ,type ,value) values (1,'aaa','d',10);
insert into transactions (account,description ,type ,value) values (1,'aaa','d',20);
insert into transactions (account,description ,type ,value) values (1,'aaa','w',10);

select * from balance;

+---------+---------+
| Account | balance |
+---------+---------+
| 1       |   20.00 |
+---------+---------+
1 row in set (0.001 sec)
...