MySql基础知识-----触发器的操作

1 触发器简介

触发器时MySql的数据库对象之一,该对象与编程语言中的函数非常类似,需要声明,执行等。但是触发器的执行不是由程序调用的,也不是手动执行的,而是由事件来出发,激活从而实现执行。比如说,在学生表中,有一个有学生名字字段,学生总数字段,每当添加一条新的学生信息时,学生总数必须跟着改变等,这些事件都有一个共同点,那就是需要在表发生更改时自动进行一些处理操作,这时就可以使用触发器处理数据库对象,触发器的使用能够加强数据库表中谁的完整性约束和业务规则等。触发器的基本操作包括创建,查看和删除。

MySql软件在出发如下语句时,就会自动执行所设置的操作:

(1)DELETE语句

(2)INSERT语句

(3)UPDATE语句


2 创建触发器

按照激活触发器时所执行的语句数目,可以将触发器分为“一条执行语句的触发器”和“多个执行语句的触发器”。


2.1 创建有一条语句执行的触发器

语法形式如下:

create trigger trigger_name before|after trigger_event on table_name for each row trigger_stmt;

上述语句中:

trigger_name 表示触发器名字。

before|after 表示触发器执行的时间,前者表示在触发事件之前执行触发器语句,后者则相反。

trigger_event表示触发事件,即触发器执行条件。

table_name表示触发事件操作表的名字。

for each row表示任何一条记录上的操作满足触发条件都会触发该触发器。

trigger_stmt表示激活触发器后执行的语句。


例如在表t_dept和表t_diary中,创建触发器实现向t_dept表中插入记录时,就会在插入之前向t_diary表中插入当前时间:

mysql> desc t_diary;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| diaryno   | int(11)     | NO   | PRI | NULL    | auto_increment |
| tablename | varchar(20) | YES  |     | NULL    |                |
| diraytime | date        | YES  |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> desc t_dept;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| deptno   | int(11)     | YES  |     | NULL    |       |
| deptname | varchar(20) | YES  |     | NULL    |       |
| location | varchar(40) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> create trigger tri_datetime before insert on t_dept for each row insert into t_diary values(NULL,'t_dept',now());
Query OK, 0 rows affected (0.03 sec)
可以看到现在触发器创建成功,现在在t_dept中插入一条数据看一下:
mysql> select * from t_dept;
Empty set (0.00 sec)

mysql> select * from t_diary;
Empty set (0.00 sec)

mysql> insert into t_dept values(1,'SALES','ShangHai');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t_dept;
+--------+----------+----------+
| deptno | deptname | location |
+--------+----------+----------+
|      1 | SALES    | ShangHai |
+--------+----------+----------+
1 row in set (0.00 sec)

mysql> select * from t_diary;
+---------+-----------+------------+
| diaryno | tablename | diraytime  |
+---------+-----------+------------+
|       1 | t_dept    | 2018-05-15 |
+---------+-----------+------------+
1 row in set (0.00 sec)
可以看到在t_dept插入数据时,t_diary也自动的插入了一条数据。


2.2 创建包含多条执行语句的触发器

语法形式如下:

create trigger trigger_name before|after trigger_event on table_name for each row begin trigger_stmt end;

在上述语句中,比“只有一条执行语句的触发器”语法多出来两个关键字begin和end,在这两个关键字之间时所要执行的多个执行语句的内容,执行语句之间用分号隔开。

在MySql中,一般情况下用“;”作为语句结束符号,可是在创建触发器时,需要用到“;”作为执行语句的结束符。为了解决该问题,可以使用关键字delimiter关键字语句,例如"delimiter$$",可以用来将结束符设置为“$$”,这样结束符就暂时变成"$$"而不是";",就可以在触发器创建语句中使用";"了,记得创建完触发器后将结束符恢复就行了。

具体示例:在表t_dept和表t_diary中创建一个触发器,当在表t_dept插入一条数据时,就在插入之后在t_diary中插入两条数据:

mysql> delimiter $$
mysql> create trigger tri_datetime2 after insert on t_dept for each row begin insert into t_diary values(NULL,'t_dept',now());insert into t_diary values(NULL,'t_dept',now()); end$$
Query OK, 0 rows affected (0.03 sec)
mysql> delimiter ;
现在向t_dept中插入一条数据,看一下结果:
mysql> select * from t_dept;
Empty set (0.00 sec)

mysql> select * from t_diary;
Empty set (0.00 sec)

mysql> insert into t_dept values(1,'SALES','ShangHai');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t_dept;
+--------+----------+----------+
| deptno | deptname | location |
+--------+----------+----------+
|      1 | SALES    | ShangHai |
+--------+----------+----------+
1 row in set (0.00 sec)

mysql> select * from t_diary;
+---------+-----------+------------+
| diaryno | tablename | diraytime  |
+---------+-----------+------------+
|       4 | t_dept    | 2018-05-16 |
|       5 | t_dept    | 2018-05-16 |
|       6 | t_dept    | 2018-05-16 |
+---------+-----------+------------+
3 rows in set (0.00 sec)
这里一开始t_diary中没有数据,在t_dept插入一条数据之后,在t_diary中插入了3条数据,时因为之前创建的触发器也执行了一次,所以会有3条语句。


3 查看触发器

语法形式如下:
show triggers \G
具体执行结果类似以下结果:
mysql> show triggers \G
*************************** 1. row ***************************
             Trigger: tri_datetime
               Event: INSERT
               Table: t_dept
           Statement: insert into t_diary values(NULL,'t_dept',now())
              Timing: BEFORE
             Created: 2018-05-15 22:29:57.26
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
*************************** 2. row ***************************
             Trigger: tri_datetie2
               Event: INSERT
               Table: t_dept
           Statement: begin insert into t_diary values(null,'t_dept',now());insert into t_diary values(null,'t_dept',now()); end
              Timing: AFTER
             Created: 2018-05-16 07:21:51.33
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
2 rows in set (0.00 sec)


4 删除触发器

具体语法形式如下:

drop trigger trigger_name;
示例略。

猜你喜欢

转载自blog.csdn.net/purple7826/article/details/80330031
今日推荐