(10)MySQL触发器(同时操作两张表)

时间:2022-05-23 17:52:02

什么是触发器

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

举个例子,比如你现在有两个表【用户表】和【日志表】,当一个用户被创建的时候,就需要在日志表中插入创建的log日志,如果在不使用触发器的情况下,你需要编写程序语言逻辑才能实现,但是如果你定义了一个触发器,触发器的作用就是当你在用户表中插入一条数据的之后帮你在日志表中插入一条日志信息。当然触发器并不是只能进行插入操作,还能执行修改,删除

触发器的事件:事件就是比如insert是插入指令,这时候只要定义好insert,那么就会在插入时候触发,其他的update等操作不会触发

# 插入前
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
...
END
# 插入后
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
...
END
# 删除前
CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN
...
END
# 删除后
CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
BEGIN
...
END
# 更新前
CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
BEGIN
...
END
# 更新后
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
BEGIN
...
END

创建触发器的语法如下:

CREATE TRIGGER 触发器名字 BEFORE DELETE ON 触发表的名字 FOR EACH ROW

BEGIN

insert into user_log (列名) values ('值');

END

trigger_name:触发器的名称

tirgger_time:触发时机,为BEFORE或者AFTER

trigger_event:触发事件,为INSERT、DELETE或者UPDATE

tb_name:表示建立触发器的表明,就是在哪张表上建立触发器

trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句

所以可以说MySQL创建以下六种触发器:

1、BEFORE INSERT

2、BEFORE DELETE

3、BEFORE UPDATE

4、AFTER INSERT

5、AFTER DELETE

6、AFTER UPDATE

修改终止符

(10)MySQL触发器(同时操作两张表)

创建触发器实例:

(10)MySQL触发器(同时操作两张表)

DROP TRIGGER 触发器名字  #删除触发器

show triggers \G;  #查看触发器的指令

*************************** 1. row ***************************
Trigger: userlog  #触发器的名字
Event: INSERT  #什么操作下触发,也就是监听的事件
Table: user  #触发表的名字
Statement: BEGIN   #触发器的开始
insert into user_log (name) values ('xxxxx');  #sql指令
END  #触发器结束
Timing: BEFORE
Created: NULL
sql_mode: NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
Database Collation: latin1_swedish_ci
*************************** 2. row ***************************
Trigger: demo
Event: DELETE
Table: user
Statement: BEGIN
insert into user_log (name) values ('xxxx');
END
Timing: BEFORE
Created: NULL
sql_mode: NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: gbk
collation_connection: gbk_chinese_ci
Database Collation: latin1_swedish_ci
2 rows in set (0.01 sec)