1. 简介

指在增删改之前或之后触发并执行触发器中定义的SQL语句集合

可协助应用在数据库端确保数据的完整性,日志记录,数据校验等

3.png

2. 语法

-- 创建触发器/修改触发器
CREATE TRIGGER [OR REPLACE] 触发器名
[BEFORE | AFTER] [INSERT | UPDATE | DELETE]
ON 表名
FOR EACH ROW
BEGIN
    -- 触发器逻辑
END;

-- 查询触发器
SHOW TRIGGERS;

-- 删除触发器
DROP TRIGGER [IF EXISTS] 触发器名;

3. 触发器案例

-- 创建学生表
CREATE TABLE STUDENT (
    ID INT NOT NULL AUTO_INCREMENT COMMENT '学生ID',
    NAME VARCHAR(50) NOT NULL COMMENT '学生姓名',
    AGE INT COMMENT '学生年龄',
    PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

-- 创建日志表
CREATE TABLE LOG (
  ID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '日志主键ID',
  CREATE_TIME DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '日志创建时间',
  EXECUTE_CONTENT TEXT NOT NULL COMMENT '日志执行内容',
PRIMARY KEY ( ID ) 
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '日志表';

4. 插入语句触发器

-- 插入前/修改后的触发器,将学生年龄修改为20岁
CREATE TRIGGER TRG_SET_AGE_INSERT
[BEFORE | AFTER] INSERT ON STUDENT
FOR EACH ROW
BEGIN
    SET NEW.AGE = 20;
END;

5. 删除语句触发器

-- 删除前/删除后的触发器,将删除内容写入到日志表中
CREATE TRIGGER TRG_DELETE
[BEFORE | AFTER ]DELETE ON STUDENT
FOR EACH ROW 
BEGIN
    INSERT INTO LOG (
        CREATE_TIME,
        EXECUTE_CONTENT
    ) VALUES (
        NOW(3),
        CONCAT(OLD.ID,'|',OLD.NAME,'|',OLD.AGE)
    );
END

6. 修改语句触发器

-- 修改前/修改后的触发器,将姓名修改为空
CREATE TRIGGER TRG_UPDATE
[BEFORE | AFTER] UPDATE ON STUDENT FOR EACH ROW BEGIN 
SET NEW.NAME = "";
END;
SHOW TRIGGERS;