1、什么是触发器
触发器(trigger)是mysql的数据库对象之一,是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时(这些事件包括insert、update、delete三种),将调用该对象,即表的操作事件触发表上的触发器的执行。
2、触发器的作用
触发器是由insert、update和delete等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。例如,当学生表中增加了一个学生信息时,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录,就执行一次计算学生总数的操作。这样就可以保证每次增加学生的记录后,学生总数是与记录数一致的。触发器触发的执行语句可能只有一个,也可能有多个。
3、触发器的特性?
- 什么时候触发?before/after, 在insert、update、delete 之前或者之后?
- 什么条件触发?insert还是update还是delete
- 触发频率:针对每一行执行 for each row
- 触发器定义在哪个表上? on Tablename
4、创建触发器
(1)创建只有一个执行语句的触发器
-- 1、创建只有一个执行语句的触发器
create trigger 触发器名 before | after 触发事件
on 表名 for each row
执行语句
- 触发器名称,指要创建的自定义触发器的名字,通常使用trigger_ 或 tg_为前缀。
- before和after参数指定了触发器执行的时间,“before”指在触发事件之前执行触发语句,after表示在触发事件之后执行触发语句。
- 触发事件:指触发的条件,其中包括insert、update和delete;
- “表名”参数指触发事件操作的表的名称;
- for each row表示任何一条记录上的操作满足触发事件都会触发该触发器;
- “执行语句”参数指触发器被触发后执行的程序。
例:在account表上创建一个触发器:当account表执行insert操作之前(before),先向user_info 表中写一条user_id = 99, realname = 'niuhehe'的数据
-- 创建触发器语句
mysql> create trigger tg_insert_account before insert on account
-> for each row
-> insert into user_info set user_id = 99, realname = 'niuhehe'
-> ;
Query OK, 0 rows affected (0.01 sec)
-- account表执行 insert 动作
mysql>
mysql> insert into account(`name`, `balance`) values('niuhehe', 125);
Query OK, 1 row affected (0.01 sec)
-- 则user_info表自动写入了一条我们设置好的数据
mysql> select * from user_info;
+----+---------+----------+------+-----------+-----------+-----------+
| id | user_id | realname | age | sheng | shi | xian |
+----+---------+----------+------+-----------+-----------+-----------+
| 1 | 1 | 张三 | 15 | 山东省 | 菏泽市 | 牡丹区 |
| 5 | 99 | niuhehe | NULL | NULL | NULL | NULL |
+----+---------+----------+------+-----------+-----------+-----------+
5 rows in set (0.00 sec)
(2)创建有多个执行语句的触发器
create trigger 触发器名 before | after 触发事件
on 表名 for each row
begin
执行语句列表
end
- begin与end直接的“执行语句列表”参数表示需要执行的多个执行语句的内容。不同的执行语句之间用英文分号隔开。
- 一般情况下,MySQL默认是以“;” 作为结束执行语句。在创建触发器过程中需要用到“;”。为了解决这个问题,可以用delimiter语句指定结束符号。如“delimiter &&”,可以将结束符号由默认的分号变成“&&”。当触发器创建完成后,可以用命令“delimiter;”来将结束符号再变会系统默认的“;”。
例:在account表上创建一个触发器:当此表执行update操作时,执行以下动作:
向p_user表中写一条 name = 'liuhaha' 的数据
向p_user_info表中写一条 realname = 'liuhaha'的数据
mysql> delimiter && -- 指定结束符号 为 &&
mysql> create trigger tg_account_update before update
-> on account for each row
-> begin
-> insert into p_user set `name` = 'liuhaha';
-> insert into p_user_info set realname = 'liuhaha';
-> end
-> &&
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ; -- 触发器创建语句完成后再指定回来
mysql>
5、查看触发器
(1)通过 show triggers 查看所有触发器
-- 列出所有触发器
show triggers;
例
(2)通过系统triggers表查看触发器
在MySQL中,所有触发器的定义都存在information_schema数据库下的triggers表中。查询triggers表,可以查看到数据库中所有触发器的详细信息。查询的语句如下:
select * from information_schema.triggers;
此语法显示了所有数据库中的触发器,我们可以通过指定字段指定条件来筛选我们需要的数据。
6、删除触发器
-- 删除触发器
drop trigger 触发器名称;