触发器

MYSQL

1 常用操作

CREATE DATABASE

CREATE TABLE

INSERT/UPDATE/DELETE/SELECT

2 Trigger(触发器)

当数据操作满足特定的情况,会自动执行指定的另一套SQL指令。

例如存在部门信息表:

t_department

t_department
ID  NAME
1   Java
2   PHP
3   UI

CREATE TABLE t_department (
    id int auto_increment,
    name varchar(50),
    primary key(id)
) DEFAULT CHARSET=UTF8;

INSERT INTO t_department (name) VALUES ('JAVA');
INSERT INTO t_department (name) VALUES ('PHP');
INSERT INTO t_department (name) VALUES ('UI');

并且存在员工信息表:

t_employee

t_employee
ID  NAME    DEPARTMENT_ID
1   JACK    2
2   TOM     3
3   JIM     3
4   BILLY   1
5   DAVID   2

CREATE TABLE t_employee (
    id int auto_increment,
    name varchar(50),
    department_id int,
    primary key(id)
) DEFAULT CHARSET=UTF8;

INSERT INTO t_employee (name, department_id) VALUES ('JACK', 2);
INSERT INTO t_employee (name, department_id) VALUES ('TOM', 3);
INSERT INTO t_employee (name, department_id) VALUES ('JIM', 3);
INSERT INTO t_employee (name, department_id) VALUES ('BILLY', 1);
INSERT INTO t_employee (name, department_id) VALUES ('DAVID', 2);

当需要删除某条部门信息表中的数据时,员工信息表中的数据也应该有相关的处理,例如删除ID=2的部门之后,在员工信息表中,可以将原来DEPARTMENT_ID=2的部门的员工设置新的部门信息DEPARTMENT_ID=0

使用触发器可以解决当某张表中的数据被执行了INSERT/DELETE/UPDATE操作时产生关联操作。

使用触发器的示例:

CREATE TRIGGER xx   // 创建触发器并命名
AFTER               // AFTER可以被替换为BEFORE
DELETE              // 可以是INSERT/DELETE/UPDATE中的任何一种
ON table            // 原来的操作是对哪张数据表的操作
FOR EACH ROW        // 在MYSQL中是固定的
BEGIN               // 准备开始执行另一张表的数据操作
操作                  // 对另一张表的操作,可以是多条SQL语句
END                 // 结束

在使用触发器,原来的操作类型和BEFORE/AFTER会共同构成6种触发条件:

BEFORE INSERT
BEFORE UPDATE
BEFORE DELETE
AFTER INSERT
AFTER UPDATE
AFTER DELETE

每张数据表中的触发器只能配置以上每种条件中各1种,即同一张数据表最多存在6种触发器。

在创建触发器时,可以在满足触发条件后执行多条SQL指令,即以上代码格式中的“操作”可以是多条指令,如果确实需要有多条指令,这些指令应该使用分号(;)进行分隔,但是,当编写“操作”时,创建触发器的语句尚未结束,一旦执到“操作”中的分号时,MYSQL就会开始尝试创建触发器,就会导致创建失败!

在MYSQL中,使用DELIMITER指令可以改变结束标识,即默认情况下,MYSQL中把分号作为每条语句的结束,但是,可以更改!例如:

DELIMITER $

一旦执行以上语句后,MYSQL只会将$作为结束标识,而不再使用分号!

需要注意的是:一旦改变了结束标识,在创建完触发器,应该还原为原来的结束标识:

DELIMITER ;

示例

针对以上列举的模拟数据和模拟需求,创建触发器应该是:

DELIMITER $
CREATE TRIGGER trigger_after_delete_department
AFTER DELETE ON t_department
FOR EACH ROW
BEGIN
    UPDATE t_employee SET department_id=0 WHERE department_id=old.id;
END $
DELIMITER ;

以上示例代码中,触发条件对应的“操作”中,old是触发执行条件时,被操作的那条数据。

show triggers; 可以显示所有的触发器

select * from t_department;select * from t_employee;
+----+------+
| id | name |
+----+------+
|  1 | JAVA |
|  2 | PHP  |
|  3 | UI   |
+----+------+
3 rows in set (0.00 sec)

+----+-------+---------------+
| id | name  | department_id |
+----+-------+---------------+
|  1 | JACK  |             2 |
|  2 | TOM   |             3 |
|  3 | JIM   |             3 |
|  4 | BILLY |             1 |
|  5 | DAVID |             2 |
+----+-------+---------------+
5 rows in set (0.00 sec)
delete from t_department where id=2;
+----+------+
| id | name |
+----+------+
|  1 | JAVA |
|  3 | UI   |
+----+------+
2 rows in set (0.00 sec)

+----+-------+---------------+
| id | name  | department_id |
+----+-------+---------------+
|  1 | JACK  |             0 |
|  2 | TOM   |             3 |
|  3 | JIM   |             3 |
|  4 | BILLY |             1 |
|  5 | DAVID |             0 |
+----+-------+---------------+
5 rows in set (0.00 sec)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 触发器 MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用...
    FTOLsXD阅读 964评论 0 1
  • MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,...
    金星show阅读 850评论 0 3
  • 触发器分类 SQL Server提供三类触发器: DML触发器:在数据库中发生数据操作(Insert、Update...
    不知名的蛋挞阅读 1,718评论 0 5
  • 一,触发器 1.创建触发器 在MySQL中,创建触发器语法如下: 代码如下: CREATE TRIGGER tri...
    君满楼001阅读 1,719评论 0 0
  • 前面说了Hibernate的单表映射,由于是实体类和数据表之间一对一的映射,所以比较简单。现在就来说说多表映射,这...
    乐百川阅读 1,288评论 0 3