我是靠谱客的博主 热情冷风,最近开发中收集的这篇文章主要介绍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;

 

最后

以上就是热情冷风为你收集整理的Mysql中触发器的使用的全部内容,希望文章能够帮你解决Mysql中触发器的使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(95)

评论列表共有 0 条评论

立即
投稿
返回
顶部