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

      触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。和存储过程一样,很少使用。

    (1).触发器的作用

      1.可在写入数据表前,强制检验或转换数据。

      2.触发器发生错误时,异动的结果会被撤销。

      3.部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。

      4.可依照特定的情况,替换异动的指令 (INSTEAD OF)。

    (2).创建触发器

      创建测试环境

    mysql> create database test_db;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use test_db;
    Database changed
    mysql> create table user_tb(id int,name varchar(20));
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> create table job_tb(uid int,job varchar(20));
    Query OK, 0 rows affected (0.04 sec)

      创建触发器语句如下:  

    create trigger [触发器名称] [before|after] [insert|update|delete] on [表名] for each row
    [触发的动作,一个update或insert或delete的SQL语句;]
    [新的结束字符]

      before和after是触发时间,insert、update和delete是监视事件。并且因为包含一个触发动作的SQL语句,所以也要使用delimiter [新字符]。

      实例

    mysql> delimiter //
    mysql> create trigger insert_job after insert on user_tb for each row
        -> insert into job_tb values (1,'老师');
        -> //
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into user_tb values(1,'张三')//
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from user_tb//
    +------+--------+
    | id   | name   |
    +------+--------+
    |    1 | 张三   |
    +------+--------+
    1 row in set (0.00 sec)
    
    mysql> select * from job_tb//
    +------+--------+
    | uid  | job    |
    +------+--------+
    |    1 | 老师   |
    +------+--------+
    1 row in set (0.00 sec)
    

      注意:触发器与监视表不能是同一个,否则会报1442的错误。

    (3).查看触发器

      show create trigger [触发器名称];  查看指定触发器

      show triggers;  查看所有触发器

    mysql> show create trigger insert_jobG  //查看指定触发器
    *************************** 1. row ***************************
                   Trigger: insert_job
                  sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    SQL Original Statement: CREATE DEFINER=`root`@`localhost` trigger insert_job after insert on user_tb for each row
    insert into job_tb values (1,'老师')
      character_set_client: utf8
      collation_connection: utf8_general_ci
        Database Collation: utf8_general_ci
                   Created: 2019-06-13 11:51:28.87
    1 row in set (0.00 sec)
    
    mysql> show triggersG  //查看所有触发器
    *************************** 1. row ***************************
                 Trigger: insert_job
                   Event: INSERT
                   Table: user_tb
               Statement: insert into job_tb values (1,'老师')
                  Timing: AFTER
                 Created: 2019-06-13 11:51:28.87
                sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
                 Definer: root@localhost
    character_set_client: utf8
    collation_connection: utf8_general_ci
      Database Collation: utf8_general_ci
    1 row in set (0.00 sec)

    (4).删除触发器

      drop trigger [触发器名称];

    mysql> drop trigger insert_job//
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show triggersG
    Empty set (0.00 sec)
    

    (5).扩展

      由于触发器其实是一种特殊的存储过程,所以触发动作其实可以使用begin [SQL语句集] end来扩展其使用方法,详见:Mysql存储过程

  • 相关阅读:
    Android的各版本间的区别总结
    深入浅出Android开发之Surface介绍
    android中完全退出当前应用程序的四种方法
    android离线地图源码
    坐标系
    mysql安装
    linux磁盘空间清理
    HttpClient教程
    TIME_WAIT过多
    c3p0配置详解
  • 原文地址:https://www.cnblogs.com/diantong/p/11014438.html
Copyright © 2011-2022 走看看