MySQL触发器

准备代码:

CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;
use shop;
CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `add_time` TIMESTAMP DEFAULT NOW(),
  PRIMARY KEY (`id`),
  KEY `name` (`name`(250)) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT;

CREATE TABLE `logs` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `log` varchar(255) DEFAULT NULL COMMENT '日志说明',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3 COMMENT='日志表';
View Code

 1.什么是触发器

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

2.创建触发器

(1)语法:

CREATE TRIGGER <trigger_name>  
  BEFORE|AFTER
  INSERT|UPDATE|DELETE  ON <table_name> #表名
  FOR EACH ROW 
  BEGIN
  <触发的SQL语句>(调用NEW/OLD参数);
  END

参数说明:

1>CREATE TRIGGER <trigger_name> --- 触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.

2>{ BEFORE | AFTER } --- 触发器触发时间设置:可以设置为事件发生前或后(前:一般用于校验;后:一般用于关联)。

3>{ INSERT | UPDATE | DELETE } -- 设定触发事件:如执行insert、update或delete的过程时激活触发器。

触发器类型触发器功能激活触发器的语句
INSERT触发器 将新行插入表时激活触发器。 INSERT ,LOAD, DATA ,REPLACE
DELETE触发器 从表中删除某一行数据时激活触发器。 DELETE ,REPLACE
UPDATE触发器 更改表中某一行数据时激活触发器。 DELETE

4>ON <table_name> --- 触发器是属于某一个表的: 当在这个表上执行 INSERT|UPDATE|DELETE 操作的时候就导致触发器的激活. 同时,我们不能给同一张表的“同一个事件”安排两个触发器(意味着不能同时有两个Insert触发器)。

5>FOR EACH ROW --- 触发器的执行间隔(必有的公式内容):FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。

6><触发的SQL语句> --- 触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。当然,触发SQL中可以调用“触发了( INSERT | UPDATE | DELETE )触发器的那一行数据”。

注意:每个表都支持 INSERT、UPDATE 和 DELETE 的 BEFORE 与 AFTER,因此每个表最多支持 6 个触发器。每个表的每个事件每次只允许有一个触发器。单一触发器不能与多个事件或多个表关联。

(2).NEW和OLD的使用(转自:https://www.cnblogs.com/zh-1721342390/p/9602941.html)

  根据以上的表格,可以使用一下格式来使用相应的数据:

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

例1:创建一个名为 user_log的触发器,触发的条件是向数据表users 中插入数据之后,再向logs表中的log字段写入新插入行的name字段+“is created”信息。

drop TRIGGER if EXISTS user_log;
DELIMITER $
CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8mb3;
DECLARE s2 VARCHAR(20) character set utf8mb3;
SET s2 = " is created";
SET s1 = CONCAT(NEW.name,s2);#函数CONCAT可以将字符串连接
INSERT INTO logs(log) values(s1);
END $
DELIMITER ;

insert into users(`name`,`add_time`) values('小明','2022/12/12');
select * from users;
select * from logs;

结果如下:

3.查看触发器

SHOW TRIGGERS;

 SHOW TRIGGERS 语句用来查看当前创建的所有触发器的信息。因为该语句无法查询指定的触发器,所以在触发器较少的情况下,使用该语句会很方便。如果要查看特定触发器的信息或者数据库中触发器较多时,可以直接从 information_schema 数据库中的 triggers 数据表中查找。

在triggers表中查看触发器信息

在 MySQL 中,所有触发器的信息都存在 information_schema 数据库的 triggers 表中,可以通过查询命令 SELECT 来查看,具体的语法如下:

SELECT * FROM information_schema.triggers WHERE trigger_name= '触发器名';

例:使用select命令查看user_log触发器的信息。

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME= 'user_log';

4.修改和删除触发器(转自:http://c.biancheng.net/view/2601.html)

修改触发器可以通过删除原来的触发器,再创建相同名称的触发器。

删除触发器的语法:DROP TRIGGER [ IF EXISTS ] [数据库名] <触发器名>

语法说明如下:

1) 触发器名

要删除的触发器名称。

2) 数据库名

可选项。指定触发器所在的数据库的名称。若没有指定,则为当前默认的数据库。

3) 权限

执行 DROP TRIGGER 语句需要 SUPER 权限。

4) IF EXISTS

可选项。避免在没有触发器的情况下删除触发器。

注意:删除一个表的同时,也会自动删除该表上的触发器。另外,触发器不能更新或覆盖,为了修改一个触发器,必须先删除它,再重新创建。

 

参考文章:

http://c.biancheng.net/view/2601.html

 https://www.cnblogs.com/zh-1721342390/p/9602941.html

https://zhuanlan.zhihu.com/p/158670286

posted @ 2022-12-22 16:54  YorkShare  阅读(233)  评论(0编辑  收藏  举报