欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql触发器之创建使用触发器简单示例

程序员文章站 2023-11-10 18:49:46
本文实例讲述了mysql触发器之创建使用触发器。分享给大家供大家参考,具体如下: 我们可以可以使用create trigger语句创建一个新的触发器,来看下具体的语法: c...

本文实例讲述了mysql触发器之创建使用触发器。分享给大家供大家参考,具体如下:

我们可以可以使用create trigger语句创建一个新的触发器,来看下具体的语法:

create trigger trigger_name trigger_time trigger_event
 on table_name
 for each row
 begin
 ...
 end;

然后我们来详细看下上述sql的具体含义:

  • 将触发器名称放在create trigger语句之后。触发器名称应遵循命名约定[trigger time]_[table name]_[trigger event],例如before_employees_update。
  • 触发激活时间可以在之前或之后。必须指定定义触发器的激活时间。如果要在更改之前处理操作,则使用before关键字,如果在更改后需要处理操作,则使用after关键字。
  • 触发事件可以是insert,update或delete。此事件导致触发器被调用。 触发器只能由一个事件调用。要定义由多个事件调用的触发器,必须定义多个触发器,每个事件一个触发器。
  • 触发器必须与特定表关联。没有表触发器将不存在,所以必须在on关键字之后指定表名。
  • 将sql语句放在begin和end块之间。这是定义触发器逻辑的位置。

大概了解了之后,我们就来尝试创建触发器来记录employees表中行数据的更改情况,先来看下这个表的结构:

mysql> desc employees;
+----------------+--------------+------+-----+---------+-------+
| field     | type     | null | key | default | extra |
+----------------+--------------+------+-----+---------+-------+
| employeenumber | int(11)   | no  | pri | null  |    |
| lastname    | varchar(50) | no  |   | null  |    |
| firstname   | varchar(50) | no  |   | null  |    |
| extension   | varchar(10) | no  |   | null  |    |
| email     | varchar(100) | no  |   | null  |    |
| officecode   | varchar(10) | no  | mul | null  |    |
| reportsto   | int(11)   | yes | mul | null  |    |
| jobtitle    | varchar(50) | no  |   | null  |    |
+----------------+--------------+------+-----+---------+-------+
8 rows in set

我们再来创建一个名为employees audit的新表,用来保存employees表中数据的更改:

create table employees_audit (
  id int auto_increment primary key,
  employeenumber int not null,
  lastname varchar(50) not null,
  changedat datetime default null,
  action varchar(50) default null
);

再来创建一个before update触发器,该触发器在对employees表中的行记录更改之前被调用:

delimiter $$
create trigger before_employee_update 
  before update on employees
  for each row 
begin
  insert into employees_audit
  set action = 'update',
   employeenumber = old.employeenumber,
    lastname = old.lastname,
    changedat = now(); 
end$$
delimiter ;

在上述触发器的主体中,我们使用old关键字来访问受触发器影响的行的employeenumber和lastname列。我们要注意的是,在为insert定义的触发器中,可以仅使用new关键字。不能使用old关键字。但是,在为delete定义的触发器中,没有新行,因此您只能使用old关键字。在update触发器中,old是指更新前的行,而new是更新后的行。

然后,我们可以使用show triggers语句,来查看数据库中的触发器:

mysql> show triggers;
+------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| trigger        | event | table   | statement                                                                               | timing | created        | sql_mode                                     | definer    | character_set_client | collation_connection | database collation |
+------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| before_employee_update | update | employees | begin
  insert into employees_audit
  set action = 'update',
   employeenumber = old.employeenumber,
    lastname = old.lastname,
    changedat = now();
end | before | 2017-08-02 22:06:36.40 | only_full_group_by,strict_trans_tables,no_auto_create_user,no_engine_substitution | root@localhost | utf8         | utf8_general_ci   | utf8_general_ci  |
+------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
1 row in set

完事我们就来更新employees表以检查触发器是否被调用:

update employees 
set 
  lastname = 'maxsu'
where
  employeenumber = 1056;

可以使用以下查询来查询employees_audit表,用以检查触发器是否被update语句调用:

mysql> select * from employees_audit;
+----+----------------+----------+---------------------+--------+
| id | employeenumber | lastname | changedat      | action |
+----+----------------+----------+---------------------+--------+
| 1 |      1056 | hill   | 2017-08-02 22:15:51 | update |
+----+----------------+----------+---------------------+--------+
1 row in set

如上面输出结果所示,触发器被真正调用,并在employees_audit表中插入一个新行。

好啦,本次记录就到这里了。