一、 触发器
+++ 什么是触发器
触发器(TRIGGER)是由 INSERT、UPDATE 和 DELETE 等事件来触发某种特定操作。满足
触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样可以保证某些操作
之间的一致性。
+++ 触发器作用
当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成!!
二、 创建触发器
2.1 创建只有一个执行语句的触发器
+++ 基本形式如下:
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件 ON 表名 FOR EACH ROW
执行语句
eg:
CREATE TRIGGER dept_trig1 BEFORE INSERT ON department FOR EACH ROW
INSERT INTO triger_time VALUES(NOW());
--说明:当向department 表中执行INSERT 操作时,数据库系统都会在 INSERT 语句执行之前向 triger_time 表中插入当前时间。
例子:
例如: 当向员工表插入一条记录时,希望同时往日志表插入数据
需求: 当向员工表插入一条记录时,希望mysql自动同时往日志表插入数据
+++ 创建添加触发器
CREATE TRIGGER add_log AFTER INSERT ON student FOR EACH ROW
INSERT INTO LOG(content) VALUES('插入了一条数据');
+++ 创建修改触发器
CREATE TRIGGER upt_log AFTER update ON student FOR EACH ROW
INSERT INTO LOG(content) VALUES('修改了一条数据');
+++ 创建删除触发器
CREATE TRIGGER del_log AFTER DELETE ON student FOR EACH ROW
INSERT INTO LOG(content) VALUES('删除了一条数据');
-- 往sutdent表插入数据后,log表中会新增一条记录:插入了一条数据
insert into student(name) values('小白');
-- 往student 表修改数据时,log表中会自动新增一条记录:修改了一条数据
UPDATE student SET id =2 WHERE id =2;
-- 删除student表数据时,log表中会新增一条记录:删除了一条记录
DELETE FROM student WHERE id=7;
2.2 创建有多个执行语句的触发器
+++ 基本形式如下:
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件 ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END
其中,BEGIN 与 END 中间的 执行语句列表 参数表示需要执行的多个执行语句的内容。
不同的执行语句之间用分号隔开。
eg:
一般情况下MySQL默认是以";"(分号)作为结束执行语句。在创建触发器过程中需要用到分
号,为了解决这个问题,可以用DELIMITER 语句。如下:
mysql> DELIMITER &&
mysql> CREATE TRIGGER dept_trig2 AFTER DELETE
-> ON department FOR EACH ROW
-> BEGIN
-> INSERT INTO trigger_time VALUES('21:01:01');
-> INSERT INTO trigger_time VALUES('22:01:01');
-> END
-> &&
三、查看触发器
查看触发器是指查看数据库中已存在的触发器的定义、状态和语法等信息。查看触发器
的方法包括 SHOW TRIGGERS 语句和查询 information_schma 数据库下的 triggers 表等。
mysql> SHOW TRIGGERS \G 查询所有触发器的信息,不能查询指定的触发器
mysql> SELECT * FROM information_schema.triggers \G 查询tiggers中的信息,会显示所有触发器的详细信息
mysql> SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='dept_trig1' \G 只查询dept_trig1触发器的详细信息。
四、删除触发器
删除触发器指删除数据库中已经存在的触发器。
基本形式如下:
DROP TRIGGER 触发器名 | 数据库名.触发器名;
例子:
mysql> DROP TRIGGER test2.dept_trig1; --指定删除数据库test2下的触发器dept_trig1,
--如果不指定数据库test2,则删除当前数据库下的触发器dept_trig1。