触发器

作者: 骇客与画家 | 来源:发表于2018-01-12 12:37 被阅读0次

    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)
    

    相关文章

      网友评论

          本文标题:触发器

          本文链接:https://www.haomeiwen.com/subject/kqqfoxtx.html