Mysql触发器简介

Mysql触发器

    • 1 触发器引入
    • 2 触发器分类
    • 3 触发器作用
    • 4 使用语法
      • 1 新建
      • 2 更新
      • 3 删除
      • 4 查看
    • 5 案列
      • 1 准备数据
      • 2 创建触发器
      • 3 执行下列语句
    • 6说明

1 触发器引入

触发器(TRIGGER): 是Mysql数据库5.0版本后引入的, 触发器是一种类似存储过程的特殊类型, 通过事件触发而执行,在执行insert/update/delete语句之前或之后去执行触发器中定义的SQL语句. 存储过程是需要主动调用执行的.

总结: 触发器是被动执行,需要有触发条件,即表有新增/更新/删除操作才会去执行触发器.

2 触发器分类

触发器类型 参数说明
insert NEW 表示将要或者已经新增的数据
update OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据
delete OLD 表示将要或者已经删除的数据

3 触发器作用

1 在写入数据前,可以强制检验或转换数据等.

2 触发器执行错误,前面执行成功的SQL会撤销,形成事务回滚.

说明:

  • 触发器名在表中必须唯一,在数据库中不同表间可相同.
  • 每个表每个时间只能允许一个触发器,所以一个表最多使用6个触发器.(insert 前后/update前后/delete前后)

4 使用语法

1 新建

DELIMITER $
CREATE TRIGGER 触发器名称 
BEFORE/AFTER INSERT/UPDATE/DELETE
ON 表名称 
【 FOR EACH ROW--行级触发器
BEGIN
	触发器过程体(一组合法的SQL语句)
END $
DELIMITER ;

2 更新

触发器没有修改功能,可以先删除,后创建.

3 删除

DROP TRIGGER 触发器名称;

4 查看

--  查看所有触发器
SHOW TRIGGERS;

-- 查看触发器创建语句
SHOW CREATE TRIGGER 触发器名字;

5 案列

1 准备数据

-- 创建学生表
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 准备基础数据
INSERT INTO `test`.`user`(`id`, `name`, `age`, `email`) VALUES (1, 'Jone', 18, '[email protected]');
INSERT INTO `test`.`user`(`id`, `name`, `age`, `email`) VALUES (2, 'Jack', 20, '[email protected]');
INSERT INTO `test`.`user`(`id`, `name`, `age`, `email`) VALUES (3, 'Tom', 28, '[email protected]');
INSERT INTO `test`.`user`(`id`, `name`, `age`, `email`) VALUES (4, 'Sandy', 21, '[email protected]');

-- 创建学生操作日志表
CREATE TABLE user_log (
  id INT (20) NOT NULL AUTO_INCREMENT,
  operation VARCHAR (20) NOT NULL COMMENT '操作类型, insert/update/delete',
  operate_time DATETIME NOT NULL COMMENT '操作时间',
  operate_id INT (11) NOT NULL COMMENT '操作表的ID',
  operate_params VARCHAR (500) COMMENT '操作参数',
  PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 ;

2 创建触发器

INSERT触发器

DELIMITER $
CREATE TRIGGER user_log_insert_trigger
AFTER INSERT 
ON user 
FOR EACH ROW 
BEGIN
  INSERT INTO user_log (id,operation,operate_time,operate_id,operate_params) VALUES(NULL,'insert',NOW(),new.id,CONCAT('插入后(id:',new.id,', name:',new.name,', age:',new.age,', salary:',new.email,')'));	
END $
DELIMITER ;

UPDATE触发器

DELIMITER $
CREATE TRIGGER user_log_update_trigger
AFTER UPDATE 
ON user 
FOR EACH ROW 
BEGIN
  INSERT INTO user_log (id,operation,operate_time,operate_id,operate_params) VALUES(NULL,'update',NOW(),new.id,CONCAT('修改前(id:',old.id,', name:',old.name,', age:',old.age,', salary:',old.email,') , 修改后(id',new.id, 'name:',new.name,', age:',new.age,', salary:',new.email,')'));                                                                      
END $
DELIMITER ;

DELETE触发器

DELIMITER $
CREATE TRIGGER user_log_delete_trigger
AFTER DELETE 
ON user 
FOR EACH ROW 
BEGIN
  INSERT INTO user_log (id,operation,operate_time,operate_id,operate_params) VALUES(NULL,'delete',NOW(),old.id,CONCAT('删除前(id:',old.id,', name:',old.name,', age:',old.age,', salary:',old.email,')'));                                                                      
END $
DELIMITER ;

3 执行下列语句

INSERT INTO `test`.`user`(`id`, `name`, `age`, `email`) VALUES (5, 'Billie', 30, '[email protected]');

UPDATE user SET age = 18 WHERE id = 5;

DELETE FROM user WHERE id = 5;

image-20210504151937732

6说明

mysql触发器不能对同一张表进行修改操作,否则会报错.(只能是,通过触发器去修改其他表数据)

参考资料:

https://caochenlei.blog.csdn.net/article/details/107640904

https://blog.csdn.net/babycan5/article/details/82789099

你可能感兴趣的:(技能点,触发器,mysql,java)