概述
一、触发器:
在银行存取款业务中,每次用户进行存取款时,系统需要修改对应的账户的余额,同时也需要自动对记录本次操作(生成交易明细),而以上的操作是同时对两个表进行的(对银行信息表执行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表示数据更新(INSERT、UPDATE或者DELETE)操作影响的每一条记录都会执行一次触发程序。
mySql仅支持行级触发器,不支持语句级别的触发器(例如CREATE TABLE等语句)。
OLD、NEW关键字
当向表插入新记录时,在触发程序中可以使用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中触发器的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复