MySQL触发器

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 ;
上一篇:Mysql中 delimiter命令报错或者无法识别问题的一个解决办法


下一篇:matlab字符串分割