zoukankan      html  css  js  c++  java
  • MySQL 触发器的使用

    MySQL 基础篇

    三范式

    MySQL 军规

    MySQL 配置

    MySQL 用户管理和权限设置

    MySQL 常用函数介绍

    MySQL 字段类型介绍

    MySQL 多列排序

    MySQL 行转列 列转行

    MySQL NULL 使用带来的坑

    MySQL AND 和 OR 联合使用带来的坑

    MySQL 触发器的使用

    转载:《Mysql中的触发器》

    什么是触发器

    触发器(TRIGGER)是 MySQL 的数据库对象之一,从5.0.2版本开始支持。该对象与编程语言中的函数非常类似,都需要声明、执行等。但是触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发、激活从而实现执行。有点类似 DOM 中的事件。

    触发器是由事件触发,事件包括增,删,改操作,当数据库执行这些操作时,会激活触发器执行相应的操作。

    触发器的语法

    创建触发器

    CREATE TRIGGER trigger_name trigger_time trigger_event 
    ON tb_name FOR EACH ROW trigger_stmt
    • trigger_name:触发器名称
    • tirgger_time:触发执行时间
      • BEFORE:事件之前触发
      • AFTER:事件之后触发
    • trigger_event:触发事件
      • INSERT:插入某一行时激活触发器,INSERT,LOAD DATA,REPLACE 语句可以触发
      • UPDATE:更改某一行时激活触发器,UPDATE 语句可以触发
      • DELETE:删除某一行时激活触发器,DELETE,REPLACE 语句可以触发
    • tb_name:触发器要执行的哪张表
    • FOR EACH ROW:触发频率为每一行触发一次
    • trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用 BEGIN 和 END 包含的多条语句

    创建只有一个执行语句的触发器

    CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句;

    创建有多个执行语句的触发器

    CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
    ON 表名 FOR EACH ROW
    BEGIN
        执行语句列表
    END;

    MySQL 默认是以分号(;)作为结束执行符号,与触发器执行语句列表中需要的分行起冲突,为解决此问题可用DELIMITER,如DELIMITER ;; ,就是将结束符号变成 ;;。

    DELIMITER ;;
    CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
    ON 表名 FOR EACH ROW
    BEGIN
        执行语句列表
    END ;;
    DELIMITER;

    删除触发器

    DROP TRIGGER IF EXISTS tb_name;

    示例

    数据准备:

    -- 创建user表
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `account` varchar(255) DEFAULT NULL,
      `name` varchar(255) DEFAULT NULL,
      `address` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- 创建对user表操作历史表
    DROP TABLE IF EXISTS `user_history`;
    CREATE TABLE `user_history` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `user_id` bigint(20) NOT NULL,
      `operatetype` varchar(200) NOT NULL,
      `operatetime` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    创建 user 表插入事件对应的触发器

    DROP TRIGGER IF EXISTS `tri_insert_user`;
    DELIMITER ;;
    CREATE TRIGGER `tri_insert_user` AFTER INSERT ON `user` FOR EACH ROW begin
        INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (new.id, 'add a user',  now());
    end
    ;;
    DELIMITER ;

    创建 user 表更新事件对应的触发器

    DROP TRIGGER IF EXISTS `tri_update_user`;
    DELIMITER ;;
    CREATE TRIGGER `tri_update_user` AFTER UPDATE ON `user` FOR EACH ROW begin
        INSERT INTO user_history(user_id,operatetype, operatetime) VALUES (new.id, 'update a user', now());
    end
    ;;
    DELIMITER ;

    创建 user 表删除事件对应的触发器

    DROP TRIGGER IF EXISTS `tri_delete_user`;
    DELIMITER ;;
    CREATE TRIGGER `tri_delete_user` AFTER DELETE ON `user` FOR EACH ROW begin
        INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (old.id, 'delete a user', now());
    end
    ;;
    DELIMITER ;

    至此,全部表及触发器创建完成,开始验证结果,分别做插入、修改、删除事件,执行以下语句,观察 user_history是否自动产生操作记录。

    INSERT INTO user(account, name, address) VALUES ('user1', 'user1', 'user1');
    INSERT INTO user(account, name, address) VALUES ('user2', 'user2', 'user2');
    UPDATE user SET name = 'user3', account = 'user3', address='user3' where name='user1';
    DELETE FROM `user` where name = 'user2';

  • 相关阅读:
    二叉树进阶之寻找一棵二叉树中的最大二叉搜索子树
    二叉树进阶之求一棵二叉树中结点间最大距离
    软件工程各阶段的UML图
    软件工程各阶段的开发文档
    二叉树应用进阶之折纸(二叉树的右根左遍历)
    二叉树进阶应用之查找结点的后继结点
    二叉树进阶之满二叉树和完全二叉树
    二叉树进阶之搜索二叉树的判断与找出搜索二叉树中出错的结点
    二叉树进阶之平衡二叉树的判断
    二叉树基础之序列化和反序列化二叉树
  • 原文地址:https://www.cnblogs.com/yinjw/p/11767649.html
Copyright © 2011-2022 走看看