【发布时间】:2021-03-20 01:54:25
【问题描述】:
create schema tr_sp_lab;
use tr_sp_lab;
create table Account (
ACC_NUM varchar(8) not null,
ACC_TYPE char(2) not null,
CUS_NAME varchar(45),
BALANCE decimal(10,2),
constraint Account_pk primary key(ACC_NUM)
);
create table Transactions (
TRANS_ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ACC_NUM varchar(8) not null,
AMOUNT decimal(10,2),
TRANS_TYPE char(1),
constraint Transactions_fk foreign key(ACC_NUM) references Account(ACC_NUM)
);
create table DELETED_ACCOUNTS (
ACC_NUM varchar(8) not null,
ACC_TYPE char(2) not null,
CUS_NAME varchar(45),
BALANCE decimal(10,2),
CLOSED_DATE datetime,
constraint Deleted_Accounts_pk primary key(ACC_NUM)
);
INSERT INTO ACCOUNT VALUES
('A1', 'SA', 'Alex', 1000.0),
('A2', 'SA', 'Bob', 500.0),
('A3', 'FD', 'Alex', 3000.0),
('A4', 'SA', 'Cathy', 750.0),
('A5', 'SA', 'Daniel', 600.0),
('A6', 'FD', 'Cathy', 2000.0),
('A7', 'FD', 'Eagan', 1000.0),
('A8', 'SA', 'Eagan', 500.0),
('A9', 'SA', 'Alex', 550.0);
INSERT INTO TRANSACTIONS(ACC_NUM, AMOUNT, TRANS_TYPE) VALUES
('A1', 1000.0, 'D'),
('A2', 500.0, 'D'),
('A3', 1000.0, 'D'),
('A3', 1000.0, 'D'),
('A3', 1000.0, 'D'),
('A4', 500.0, 'D'),
('A4', 500.0, 'D'),
('A4', 250.0, 'W'),
('A5', 600.0, 'D'),
('A6', 1000.0, 'D'),
('A6', 500.0, 'D'),
('A6', 500.0, 'D'),
('A7', 1000.0, 'D'),
('A8', 500.0, 'D'),
('A9', 550.0, 'D');
#Attempted trigger code below
DELIMITER $$
create trigger account_update
after insert on transactions
for each row
begin
if trans_type='W' then
insert into account values(
new.acc_num, new.acc_type, new.cus_name, new.balance - amount
);
elseif trans_type='D' then
insert into account values(
new.acc_num, new.acc_type, new.cus_name, new.balance + amount
);
end if;
end $$
DELIMITER ;
嗨,所以我想创建一个触发器,当客户进行交易时触发,即在交易表中的 TRANS_TYPE 中存款或取款由“D”和“W”表示的金额。触发器应更新相应帐户的余额列。
当一笔金额存入账户时,对应账户的余额 数字应该增加帐户表中的那个数量。
同理,取款时,对应账号的余额 应减少提款金额。
谢谢!
【问题讨论】:
-
停下来不要。而是将
balance列全部删除。实现这样一个由其他数据计算的值——对交易求和——是多余的,并且可能导致不一致。您可以随时查询正确余额。为方便起见,您可以创建一个执行此操作的视图,这样您就不必每次都重复查询。 -
但作为提示:
INSERT创建新行。如果要更改行,请使用UPDATE。 -
但这是学校作业。无论如何,我想我解决了它