触发器(Trigger):是由事件来出发某个操作。这些事件包括insert语句、update语句和delete语句。当数据库系统执行这些操作的时候,就会激发触发器执行相应的操作。
创建语句:
CREATE TRIGGER 触发器名 before | after 触发器事件
ON 表名 FOR EACH ROW 执行语句
1> 触发器名:给创建的触发器起的名字
2> before:指在触发事件之前执行触发器语句
3> after: 在触发事件之后执行触发器语句
4> 触发事件:指触发的条件,其中包括insert、update和delete
5> 表名:指触发事件操作的表的名称
6> FOR EACH:表示任何一条记录上的操作满足触发事件都会触发该触发器
7> 执行语句:指触发器被触发后执行的程序
-- 创建教师表
CREATE TABLE teacher(
tea_num VARCHAR(10) PRIMARY KEY COMMENT "教师编号",-- 主键
name VARCHAR(30) COMMENT "姓名",
gender CHAR(2) COMMENT "性别",
age INT COMMENT "年龄",
department VARCHAR(30) COMMENT "部门",
institute VARCHAR(50) COMMENT "学院",
salary DECIMAL(10,2) COMMENT "薪水",
hire_date date COMMENT "入职时间"
)ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
-- 创建trigger_time表
CREATE TABLE trigger_time(
tri_time datetime
);
-- 1.1.1 创建触发器tea_trig1
CREATE TRIGGER tea_trig1 before INSERT
ON teacher FOR EACH ROW
INSERT INTO trigger_time VALUES(NOW());
-- 1.1.2 测试触发器tea_trig1
INSERT INTO teacher VALUES("100001","旗木卡卡西","男",30,"综合科","火影学院",2000.56,"1988-12-21");
-- 验证触发器是否执行
SELECT * FROM trigger_time;
-- 查看表信息
SELECT * FROM teacher;
创建语句:
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END
-- 2.1.1 创建触发器tea_trig2
DELIMITER $
CREATE TRIGGER tea_trig2 AFTER DELETE
ON teacher FOR EACH ROW
BEGIN
INSERT INTO trigger_time VALUES('2023-01-01 20:20:20');
INSERT INTO trigger_time VALUES('2023-01-01 20:08:08');
END $
-- 2.1.2 测试tea_trig2
DELETE FROM teacher WHERE tea_num = "100001";
/*
注意:MYSQL中,一个表在相同触发时间的相同触发条件,只能创建一个触发器。例如,teacher表中触发事件insert,触发时间为before的触发器
只能有一个。但是,可以定义触发器事件为insert的after的触发器。
*/
-- 3 查看触发器
-- 3.1 show triggers语句查看触发信息
SHOW TRIGGERS;
-- 3.2 在triggers表中查看触发器
-- 在mysql中,所有触发器的定义都在infromation_schema数据库下的triggers表中,查询triggers表,可以查看到数据库中所有触发器的详细信息
-- 3.2.1 查看所有触发器
SELECT * FROM information_schema.triggers;
-- 3.2.2 查看指定触发器
SELECT *
FROM information_schema.triggers
WHERE TRIGGER_NAME = 'tea_trig1';
-- 4 触发器的使用
-- 在mysql中,触发器的顺序是before触发器、表操作(insert、update、delete)和after触发器
CREATE TABLE trigger_test(
info VARCHAR(50)
);
-- 4.1 创建两个触发器
-- 创建before_insert触发器
CREATE TRIGGER before_insert BEFORE INSERT
ON teacher FOR EACH ROW
INSERT INTO trigger_test VALUES("before_insert");
-- 创建after_insert触发器
CREATE TRIGGER after_insert AFTER INSERT
ON teacher FOR EACH ROW
INSERT INTO trigger_test VALUES("after_insert");
-- 4.2 测试触发器
INSERT INTO teacher VALUES("1000001","旗木卡卡西","男",30,"综合科","火影学院",2000.56,"1988-12-21");
-- 5 删除触发器 语法:drop trigger 触发器名
DROP TRIGGER before_insert;
DROP TRIGGER after_insert;