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存储过程

  • 相关阅读:
    关于商业智能(Business Intelligence,简称BI)的认识
    Python连接mysql数据库和关闭数据库的方法
    Python 列表list方法clear( )和直接list [ ]的区别
    截止今天学习大数据技术的笔记
    【已解决】hive导出mysql报错:Container [pid=3962,containerID=container_1632883011739_0002_01_000002] is running 270113280B beyond the 'VIRTUAL' memory limit.
    sqoop安装配置以及简单使用
    大数据相关常用命令行或操作
    阿里巴巴数据库设计规范
    【已解决】linux环境jps命令不显示进程
    【已解决】初始化 Hive 元数据库报错slf4j-log4j12-1.7.25.jar包冲突
  • 原文地址:https://www.cnblogs.com/diantong/p/11014438.html
Copyright © 2011-2022 走看看