Mysql中触发器的使用

一、触发器:

      在银行存取款业务中,每次用户进行存取款时,系统需要修改对应的账户的余额,同时也需要自动对记录本次操作(生成交易明细),而以上的操作是同时对两个表进行的(对银行信息表执行update操作,对交易信息表完成插入操作)。 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

      触发器是在表中数据发生更改时自动触发执行的,特殊的存储过程。也就是说触发器只针对DML(insert、update和delete)。

二、语法:

CREATE TRIGGER <trigger_name>   BEFORE|AFTER

  INSERT|UPDATE|DELETE  ON <table_name> FOR EACH ROW

  BEGIN

  SQL语句;

 END

    BEFORE表示在触发事件发生之前执行触发程序。

    AFTER表示在触发事件发生之后执行触发器。

FOR EACH ROW表示数据更新(INSERTUPDATE或者DELETE)操作影响的每一条记录都会执行一次触发程序。

mySql仅支持行级触发器,不支持语句级别的触发器(例如CREATE TABLE等语句)。

OLDNEW关键字

当向表插入新记录时,在触发程序中可以使用NEW关键字表示新记录,当需要访问新记录的某个字段值时,可以使用“NEW.字段名”的方式访问。

当从表中删除某条旧记录时,在触发程序中可以使用OLD关键字表示旧记录,当需要访问旧记录的某个字段值时,可以使用“OLD.字段名”的方式访问。

三、案例:

-- ----------------------------
-- Table structure for `t_card`
-- ----------------------------
DROP TABLE IF EXISTS `t_card`;
CREATE TABLE `t_card` (
  `cardId` varchar(255) NOT NULL,
  `password` char(6) NOT NULL,
  `balance` int(11) NOT NULL,
  `open_date` date NOT NULL,
  PRIMARY KEY (`cardId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_card
-- ----------------------------
INSERT INTO t_card VALUES ('6221 1001', '111222', '900', '2019-08-08');
INSERT INTO t_card VALUES ('6221 1002', '111111', '500', '2019-08-08');
INSERT INTO t_card VALUES ('6221 2221', '565555', '200', '2019-08-08');
DROP TABLE IF EXISTS t_tran;
CREATE TABLE IF NOT EXISTS t_tran(
    id int auto_increment PRIMARY key,
    cardid varchar(19) not null,
    type varchar(10) not null,
    money int not null,
    t_time DATE not null,
    FOREIGN KEY(cardId) REFERENCES t_card(cardId)
);

DROP TRIGGER IF EXISTS t_update;
CREATE TRIGGER t_update AFTER UPDATE ON t_card
FOR EACH ROW
BEGIN
   DECLARE vtype VARCHAR(10);
   DECLARE m1 int;
   DECLARE m2 int;
    SELECT OLD.balance INTO m1 from t_card where cardid=OLD.cardid;
    SELECT NEW.balance INTO m2 from t_card where cardid=OLD.cardid;
    IF m2>m1 THEN SET vtype='存款'; 
    ELSE SET vtype='取款';
    END IF;
   INSERT INTO t_tran(cardid,type,money,t_time)VALUES(OLD.cardId,vtype,ABS(m2-m1),NOW());
END

测试代码:

UPDATE t_card set balance=balance-200 WHERE cardid='6221 1002';
SELECT * from t_card;
SELECT * from t_tran;

 

  • 16
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值