zoukankan      html  css  js  c++  java
  • mysql 触发器

    1.概念:触发器是mysql响应insert、update、delete语句时自动执行的一条SQL语句。

      ★只有表支持触发器,视图是不支持触发器的。★
      
    2.触发器需要的信息:
    <1>.唯一的触发器名称(★一个表中的触发器名称唯一,而不是一个数据库中触发器名称唯一!
     ★即两个表可以有相同名称的触发器);   
     
    <2>.触发器关联的表;
     
    <3>.触发器应该响应的事件(insert、update、delete);
     
    <4>.触发器何时执行(处理之前或者处理之后!) 
        ★故触发器分两种:前置触发器、后置触发器。
        
    <5>.一个表的一个事件最后只有两个触发器(处理之前、处理之后),所以一个表最多有6个触发器。★
     
    <6>.☆如果响应之前的触发器执行失败,响应则不会执行。
          响应之前的触发器或响应执行失败,那么响应之后的触发器则不会执行。
     
     
    4.insert事件的触发器:
     
     
    1. #1.创建两个测试表  
    2. USE mydb;  
    3.   
    4. #表1:t_tableA  
    5. CREATE TABLE t_tableA(  
    6. id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,  
    7. val VARCHAR(20)  
    8. );  
    9.   
    10. #表2:t_tableB  
    11. CREATE TABLE t_tableB(  
    12. id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,  
    13. val VARCHAR(20)  
    14. );  
    15.   
    16.   
    17. #2.创建insert后置触发器  
    18. CREATE TRIGGER tr_insert_tableA   /*tr_insert_tableA是触发器的名称*/  
    19. AFTER INSERT ON t_tableA   /*一个后置在t_tableA表上的insert的触发器*/  
    20. FOR EACH ROW  /*对所有代码行都执行*/  
    21. INSERT INTO t_tableB(val) VALUES(new.val);  /*触发器的内容,将  
    22. a表中插入的数据放到b表中一份,insert触发器会访问一个名称为new的虚拟表,获取刚插入的值*/  
    23.   
    24. /*测试一下上面的insert后置触发器*/  
    25. INSERT INTO t_tableA(val) VALUES('ok');  
    26.   
    27. /*  
    28. 说明:  
    29. ①在insert触发器内,可引用一个名为new的虚拟表,访问被插入的行  
    30. ②在beforeInsert触发器中,new中的值也可以被更新(运行更改被插入的值)  
    31. ③对于自动增长列,new在insert执行之前的值为0,在执行之后是新的自动生成的值  
    32. */  
    33.   
    34. #第二个触发器:获得刚刚插入的自动生成的主键值  (注意:你应该把上面的一个触发器删掉再创建这个啊!!)  
    35. CREATE TRIGGER t_insert_pk_tableA  
    36. AFTER INSERT ON t_tableA  
    37. FOR EACH ROW  
    38. SELECT new.id INTO @id;  
    39.   
    40. /*测试一下*/  
    41. INSERT INTO t_tableA(val) VALUES('no');  
    42. SELECT @id;     
    2.update事件的触发器:
    #①在update触发器代码中,可以引用一个名为old的虚拟访问以前的值,引用一个名为new的表访问新更新的值
    #②在beforeupdate触发器中,new表中的值允许被更新(允许更改要用于update语句中的值);
    #③old表的值都是只读的,不能更改的。
     
     
    1. eg.创建一个触发器,将a表中修改后的名字都更改为大写!! 
    2.  
    3. DELIMITER // 
    4. CREATE TRIGGER t_update_tableA 
    5. BEFORE UPDATE ON t_tableA 
    6. FOR EACH ROW 
    7. BEGIN 
    8. SET new.val = UPPER(new.val);  /*so important!!*/ 
    9. END // 
    10. DELIMITER ; 
    11.  
    12. 测试一下上面的触发器: 
    13. UPDATE t_tableA SET val='xyz' WHERE id=1; 
     
    3.delete事件的触发器:
     
    ①在delete触发器代码中,可以引用一个old的虚拟表,访问被删除的行。
     
    ②old表中的值全部是只读的,不能更新的!!
     
     
    1. /*把从a表删除的数据,插入到b表中,可以作为备份用!*/ 
    2.  
    3. DELIMITER // 
    4. CREATE TRIGGER t_delete_tableA 
    5. AFTER DELETE ON t_tableA  
    6. FOR EACH ROW  
    7. BEGIN 
    8. INSERT INTO t_tableB(val) VALUES(old.val); 
    9. END // 
    10. DELIMITER ; 
    11.  
    12. /*测试一把:*/ 
    13. DELETE FROM t_tableA WHERE id=1; 
     
    4.触发器的删除:drop trigger tr_insert_tableA;(tr_insert_table是触发器名)
     
     
    5.说明性的东西:
    <1>.从我上面的三个例子,你可以发现,delimiter //,以及begin,end //不是必须的东西;写与不写影响不大。
     
    <2>.由于这玩意在开发用的比较少,我这里只说了最基本的应用。以后需要了咱们再接着补充吧!
     
     
     
    1.  
    2.  
    3.  

    本文出自 “我的JAVA世界” 博客,请务必保留此出处http://hanchaohan.blog.51cto.com/2996417/926550

  • 相关阅读:
    数学图形(1.25)cassini曲线
    数学图形(1.24)巴斯加线与蚶线
    数学图形(1.23)太极线
    webpack打包多个入口文件
    cnpm与npm的区别
    入门 Webpack,看这篇就够了
    protocol error, got 'n' as reply type byte + redis如何后台启动
    PHP执行系统外部命令函数:exec()、passthru()、system()、shell_exec()
    CentOS7.0+Zend Guard Loader for PHP 5.6环境搭建
    通过shell脚本进行数据库操作
  • 原文地址:https://www.cnblogs.com/yelongsan/p/7306911.html
Copyright © 2011-2022 走看看