【问题标题】:How do I create an SQL trigger that updates on one table after an activity on another table?如何创建一个 SQL 触发器,在另一个表上的活动之后更新一个表?
【发布时间】: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
  • 但这是学校作业。无论如何,我想我解决了它

标签: mysql sql


【解决方案1】:
DELIMITER $$
create trigger account_update
after insert on transactions
for each row
begin

    declare curr_balance decimal(10,2);
    select balance INTO curr_balance from account where acc_num=new.acc_num;

    if new.trans_type='W' then
        update account set balance = curr_balance - new.amount where acc_num=new.acc_num;
    elseif new.trans_type='D' then
        update account set balance = curr_balance + new.amount where acc_num=new.acc_num;

    end if;
end $$
DELIMITER ;

这是我对我的问题的回答

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2020-08-23
    • 1970-01-01
    • 2011-02-10
    • 2013-01-25
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多