zoukankan      html  css  js  c++  java
  • Mysql中的触发器

    什么是触发器

    简单的说,就是一张表发生了某件事(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行;

    特点及作用

    特点:触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行;

    作用:保证数据的完整性,起到约束的作用;

    例子:创建触发器,记录表的增、删、改操作记录

    接下来将创建user和user_history表,以及三个触发器tri_insert_user、tri_update_user、tri_delete_user,分别对应user表的增、删、改三件事;

    • 创建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表插入事件对应的触发器tri_insert_user;

    几点说明:

    DELIMITER:改变输入的结束符,默认情况下输入结束符是分号;,这里把它改成了两个分号;;,这样做的目的是把多条含分号的语句做个封装,全部输入完之后一起执行,而不是一遇到默认的分号结束符就自动执行;

    new:当触发插入和更新事件时可用,指向的是被操作的记录

    old: 当触发删除和更新事件时可用,指向的是被操作的记录

    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表更新事件对应的触发器tri_update_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表删除事件对应的触发器tri_delete_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';

    弊端

    增加程序的复杂度,有些业务逻辑在代码中处理,有些业务逻辑用触发器处理,会使后期维护变得困难;

    转: https://www.cnblogs.com/chenpi/p/5130993.html

  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/fps2tao/p/10400936.html
Copyright © 2011-2022 走看看