MySQL中的触发器问题

问题描述 投票:1回答:1

我必须创建表和触发器来进行银行帐户移动。我已经做了一些,但是我仍然处于平衡状态。我有这些表:

[这里我只是插入有关交易的信息,描述中说我在做什么(存入50,提取20等),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 ;
mysql triggers database-trigger
1个回答
0
投票

您只能更新存在的行-测试是否存在余额,如果不存在则创建。

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)
© www.soinside.com 2019 - 2024. All rights reserved.