1.触发器的概念:

 触发器是与表有关的数据对象,在满足定义条件时触发,并执行行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

 举个列子,比如你现在有两个表【用户表】 和【日志表】,当一个用户创建的时候,就需要在日志表中插入创建的log 日志,如果在不使用触发器的情况下,你需要编写程序语言才能实现,触发器还可以对表执行修改、删除创建。

CREATE TRIGGER  trigger_name trigger_time trigger_event on tb_name FOR EACH ROW trigger_stmt 

trigger_name:触发器的名称

triiger_time: 触发时机,为BEFORE 或者AFTER

trigger_event:触发事件,为INSERT 、DELETE 或者 UPDATE

tb_name: 表示建立触发器的表名,就是在那张表上建立触发器

trigger_stmt:触发器的程序体,可以是一条SQL 语句或者是用BEGIN 和END 包含多条语句

所以总的来说可以创建一下六种触发器

BEFORE INSERT,  BEFORE DELETE, BEFORE UPDATE 

AFTER INSERT,AFTER DELETE, AFTER UPDATE 

2. 其中触发器名参数指要创建的触发器的名字

BEFORE 和 AFTER 参数指定了触发执行的时间,在事件之前或者之后

FOR EACH ROW 表示任何一条记录上操作满足触发事件都会触发改触发器

3. 创建有多个执行语句的触发器

CREATE TRIGGER 触发器名   BEFORE | AFTER  触发事件

ON 表名 FOR EACH ROW 

BEGIN 

执行语句列表

END 

 3.1 说明:BEGIN 与END 之间的执行语句列表参数需要执行多个sql语句时,不同语句用分号隔开

 3.2 一般情况,mysql 默认是以;作为执行语句,与触发器中需要的分行起冲突

  解决此问题,可以采用DELMITER 重新定义一个符号,如:DELMITER ||,可以将结束符号变成 ||

 当触发器创建完成后,可以用DELIMITER;来将结束符号变成;

DELIMITER ||
CREATE TRIGGER demo BEFORE DELETE
ON users FOR EACH ROW
BEGIN 
INSERT INTO logs VALUES(NOW());
END 
||

4.变量定义



DECLARE var_name var_type [DEFAULT value] #定义变量,可指定默认值 SET var_name = value #给变量赋值



5.表中字段引用 NEW和OLD的使用:



NEW.columnname:新增行的某列数据 OLD.columnname:删除行的某列数据



6. 完整的触发器列子:

 6.1 现有用户表:

  



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;



6.2 日志log表:



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='日志表';



6.3 

需求是:当在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 ;



7.常用语句

SHOW TRIGGERS  查看触发器

8.SELECT * FROM information_schema.`TRIGGERS` 查询数据库上面所有的TRIGGERS