• MySQL学习笔记十一:触发器


    一、触发器概念

    触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。

    二、触发器创建

    2.1、创建语法

    CREATE [DEFINER = { 'user' | CURRENT_USER }] 
    TRIGGER trigger_name
    trigger_time trigger_event
    ON table_name
    FOR EACH ROW
    [trigger_order]
    trigger_body

    2.2、创建语法关键词解释

    2.3、触发执行内容OLD与NEW

    OLD:表示将要删除的旧行(类似于SQL Server中的DELETED表,只不过前者是行记录,后者是表)。

    NEW:表示将要插入的新行(类似于SQL Server中的INSERTED表,只不过前者是行记录,后者是表)。

    注:因为是单行记录,可以将它们理解为面向对象语言中的对象,直接通过`OLD.字段名`和`NEW.字段名`来使用。

    事件与OLD、NEW的对应关系:

    由上可见,更新一条记录,实际上是先将原记录删除(临时保存在OLD中),再插入一条新的记录(临时保存在NEW中)。

    三、触发器示例

    3.1、触发自身表

    1)需求描述:假设有个员工表,如果新入职人员(INSERT)的年龄小于18岁时,自动将其更新为18岁。

    2)测试表创建:

    DROP TABLE IF EXISTS EMP1;
    CREATE TABLE `emp1` (
      `ID` int(11) DEFAULT NULL,
      `NAME` varchar(50) DEFAULT NULL,
      `AGE` int(11) DEFAULT NULL,
      KEY `ID_INDEX` (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    3)触发器创建:

    #当年龄小于18岁时自动更新为18岁
    DELIMITER $$
    DROP TRIGGER IF EXISTS triEmp1ForInsert$$
    CREATE TRIGGER triEmp1ForInsert BEFORE INSERT ON EMP1 FOR EACH ROW
    BEGIN
        IF (NEW.AGE<18) THEN
            SET NEW.AGE=18;
        END IF;
    END$$
    DELIMITER ;

    4)数据插入:

    INSERT INTO EMP1 VALUES (1,'HELLO',17);

    5)结果查询:

    SELECT * FROM EMP1;

    6)注意事项:

    需要注意的是,MySQL触发器不允许对自身表进行更新,但是允许更新NEW。

    因此,上面的需求假如想通过AFTER INSERT来更改EMP1表,是行不通的。

    下面进行错误的演示:

    #错误的演示
    DELIMITER $$
    DROP TRIGGER IF EXISTS triEmp1ForInsert$$
    CREATE TRIGGER triEmp1ForInsert AFTER INSERT ON EMP1 FOR EACH ROW
    BEGIN
        IF (NEW.AGE<18) THEN
            UPDATE EMP1 SET AGE=18 WHERE ID=NEW.ID;
        END IF;
    END$$
    DELIMITER ;

    3.2、触发其它表

    1)需求描述:假设有两个表结构一样的表EMP1和EMP2,如果EMP1有新记录插入时而EMP2还没有,则将新记录也插入到EMP2中。

    2)测试表创建:

    DROP TABLE IF EXISTS EMP1;
    CREATE TABLE `emp1` (
      `ID` int(11) DEFAULT NULL,
      `NAME` varchar(50) DEFAULT NULL,
      `AGE` int(11) DEFAULT NULL,
      KEY `ID_INDEX` (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    DROP TABLE IF EXISTS EMP2;
    CREATE TABLE `emp2` (
      `ID` int(11) DEFAULT NULL,
      `NAME` varchar(50) DEFAULT NULL,
      `AGE` int(11) DEFAULT NULL,
      KEY `ID_INDEX` (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    3)触发器创建:

    #EMP1插入新记录而EMP2没有时,将新记录也插入到EMP2中。
    DELIMITER $$
    DROP TRIGGER IF EXISTS triEmp1ForInsert$$
    CREATE TRIGGER triEmp1ForInsert AFTER INSERT ON EMP1 FOR EACH ROW
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM EMP2 WHERE ID=NEW.ID) THEN
            INSERT INTO EMP2 (ID,`NAME`,AGE) VALUES (NEW.ID,NEW.NAME,NEW.AGE);
        END IF;
    END$$
    DELIMITER ;

    4)数据插入:

    INSERT INTO EMP1 VALUES (1,'HELLO',18);

    5)结果查询:

    SELECT * FROM EMP2;

    四、触发器查看

    #查看当前数据库所有触发器
    SHOW TRIGGERS;
     
    #查看指定数据库所有触发器
    SHOW TRIGGERS FROM TEST;
    
    #查看指定数据库指定表所有触发器
    SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_OBJECT_SCHEMA='TEST' AND EVENT_OBJECT_TABLE='EMP1';

    五、触发器删除

    #直接删除触发器
    DROP TRIGGER triEmp1ForInsert;
    
    #先检查再删除触发器
    DROP TRIGGER IF EXISTS triEmp1ForInsert;
  • 相关阅读:
    eclipse中打断点debug无效
    Jenkins构建部署Maven项目
    自动生成实体类和xml
    session 控制单点登录
    eclipse team 没有svn
    easyui combobox 设置滚动条
    unkow jdbc driver : http://maven.apache.org
    easyui datagrid列显示图片
    mysql中计算日期整数差
    Map<String, Object>转Object,Object转 Map<String, Object>
  • 原文地址:https://www.cnblogs.com/atomy/p/13643177.html
Copyright © 2020-2023  润新知