【问题标题】:Problems with triggers in MySQLMySQL 中的触发器问题
【发布时间】:2020-08-13 03:05:03
【问题描述】:

我必须创建表和触发器来进行银行账户移动。我已经做了一些,但我被困在平衡一上。我有这些表:

这里我只是插入有关交易的信息,描述说明我在做什么(存款 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
); 

我已经做了一个触发器,说明哪些用户进行了交易和其他信息。后来我发现了一个问题。

我有一张名为 balance 的表,我需要在其中有帐号和当前余额。

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 ;

【问题讨论】:

  • 您在什么时候为帐户创建余额 - 是在创建帐户时,还是需要在第一次交易发生时创建它。 (此触发器预计存在余额)
  • 我尝试在余额表中将余额设置为默认值 0,但它也不起作用,因为它只是让余额一直为 0。所以我真的不明白我做错了什么。
  • 我认为“移动后插入”是一个错字,因为您“创建 TABLE 事务” - 但也许不是?
  • 我在插入之后放入,因为我需要在任何存款或取款后更新余额,所以我认为它应该是在交易表中插入之后,也许我错了。
  • 触发器在一个不存在的表上!请再次阅读我的上一条评论。

标签: mysql triggers database-trigger


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 2011-03-17
    • 1970-01-01
    • 2023-04-02
    • 2015-12-02
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多