MySQL触发器
1、语法
单条sql得触发器
CREATE TRIGGER -- 固定写法
trigger_name -- 触发器名字
trigger_time -- 触发时间 BEFORE、AFTER
trigger_event -- 触发事件INSERT、DELETE或者UPDATE
ON tb_name -- 作用于哪张表上
FOR EACH ROW -- 固定写法
trigger_stmt -- 一条或多条sql,多条使用分号隔开
trigger_name:触发器的名称
tirgger_time:触发时机,为BEFORE或者AFTER
trigger_event:触发事件,为INSERT、DELETE或者UPDATE
tb_name:表示建立触发器的表明,就是在哪张表上建立触发器
trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句
所以可以说MySQL创建以下六种触发器:
BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE
AFTER INSERT,AFTER DELETE,AFTER UPDATE
多条sql得触发器
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表(分号隔开)
END
**tips:**一般情况下,mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突
为解决此问题可用DELIMITER,如:DELIMITER ||,可以将结束符号变成||
当触发器创建完成后,可以用DELIMITER ;来将结束符号变成;
DELIMITER ||
CREATE TRIGGER demo BEFORE DELETE
ON users FOR EACH ROW
BEGIN
INSERT INTO logs VALUES(NOW());
INSERT INTO logs VALUES(NOW());
END
||
DELIMITER ;
上面的语句中,开头将结束符号定义为 ||,中间定义一个触发器,一旦有满足条件的删除操作
就会执行BEGIN和END中的语句,接着使用||结束
最后使用DELIMITER ; 将结束符号还原
2、trigger_time
只有两个值,一个是BEFORE
,一个是AFTER
,意思是在trigger_event执行前触发触发器,还是在trigger_event执行后触发
3、trigger_event
触发器类型 | 激活触发器语句 |
---|---|
INSERT | INSERT, LOAD DATA, REPLACE |
UPDATE | UPDATE |
DELETE | DELETE, REPLACE |
load data语句是将文件的内容插入到表中,相当于是insert语句,
replace语句在一般的情况下和insert差不多,但是如果表中存在primary 或者unique索引的时候,如果插入的
数据和原来的primary key或者unique相同的时候,会删除原来的数据,然后增加一条新的数据,所以有的时
候执行一条replace语句相当于执行了一条delete和insert语句。
4、OLD和NEW的使用
触发类型 | NEW和OLD的使用 |
---|---|
INSERT | NEW表示将要或者已经新增的数据 |
UPDATE | OLD用来表示将要或者已经被删除的语句,NEW表示将要或者已经修改的数据 |
DELETE | OLD表示将要或者已经删除的数据 |
NEW.columnname
:新增行的某列数据
OLD.columnname
:删除行的某列数据
5、触发器的使用
-- 用户users表
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
`add_time` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`(250)) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1;
-- 日志logs表:
CREATE TABLE `logs` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`log` varchar(255) DEFAULT NULL COMMENT '日志说明',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志表';
-- 需求是:当在users中插入一条数据,就会在logs中生成一条日志信息。
-- 创建触发器:
DELIMITER $
CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8;
DECLARE s2 VARCHAR(20) character set utf8;#后面发现中文字符编码出现乱码,这里设置字符集
SET s2 = " is created";
SET s1 = CONCAT(NEW.name,s2); #函数CONCAT可以将字符串连接
INSERT INTO logs(log) values(s1);
END $
DELIMITER ;