zoukankan      html  css  js  c++  java
  • MySql触发器使用解说

          林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

          触发器(TRIGGER)是由事件来触发某个操作。

    这些事件包含INSERT语句、UPDATE语句和DELETE语句。

    当数据库系统运行这些事件时,就会激活触发器运行对应的操作。MySQL从5.0.2版本号開始支持触发器。

    在本文中将解说的内容包含:
    触发器的含义和作用
    怎样创建触发器
    怎样查看触发器
    怎样删除触发器

           触发器是由INSERT、UPDATE和DELETE等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会运行触发器中定义的程序语句。这样做能够保证某些操作之间的一致性。

    比如,当学生表中添加了一个学生的信息时。学生的总数就必须同一时候改变。能够在这里创建一个触发器,每次添加一个学生的记录,就运行一次计算学生总数的操作。这样就能够保证每次添加学生的记录后,学生总数是与记录数是一致的。触发器触发的运行语句可能仅仅有一个,也可能有多个。本节将具体解说创建触发器的方法。


    一、语法

    创建仅仅有一个运行语句的触发器

    MySQL中,创建仅仅有一个运行语句的触发器的基本形式例如以下:

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

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

    MySQL中,触发器触发的运行语句可能有多个。创建有多个运行语句的触发器的基本形式例如以下:

    CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件
    ON 表名 FOR EACH ROW
    BEGIN
    运行语句列表
    END
    以下来具体说说语法

    1、命名规则

    CREATE TRIGGER <触发器名称> <--
    { BEFORE | AFTER }
    { INSERT | UPDATE | DELETE }
    ON <表名称>
    FOR EACH ROW
    BEGIN
    <触发器SQL语句>
    END

    触发器必须有名字,最多64个字符。可能后面会附有分隔符.它和MySQL中其它对象的命名方式基本相象.
    2、触发时间: BEFORE | AFTER
    触发器有运行的时间设置:INSERT | UPDATE | DELETE
    3、触发事件前后
    相同也能设定触发的事件:它们能够在运行insert、update或delete的过程中触发。


    4.、表
    触发器是属于某一个表的:当在这个表上运行插入、
    更新或删除操作的时候就导致触发器的激活.
    我们不能给同一张表的同一个事件安排两个触发器。
    5.、( 步长)触发间隔
    触发器的运行间隔:FOR EACH ROW子句通知触发器
    每隔一行运行一次动作,而不是对整个表运行一次。


    6、 语句
    触发器包含所要触发的SQL语句:这里的语句能够是不论什么合法的语句,
    包含复合语句,可是这里的语句受的限制和函数的一样。


    Privileges权限
    你必须拥有相当大的权限才干创建触发器(CREATE TRIGGER)。假设你已经是Root用户。那么就足够了。这跟SQL的标准有所不同。


    二、关于旧的和新创建的列的标识

         在触发器的SQL语句中,你能够关联表中的随意列。

    但你不能仅使用列的名称去标识。那会使系统混淆。由于那里可能会有列的新名(这可能正是你要改动的,你的动作可能正是要改动列名)。还有列的旧名存在。因此你必须用这种语法来标识: "NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . column_name)新和旧的列名属于创建了过渡变量("transition variables")。

          对于INSERT语句,仅仅有NEW是合法的;对于DELETE语句,仅仅有OLD才合法。而UPDATE语句能够在和NEW以及OLD同一时候使用。


    三、使用范例

    先创建两个表、一个订单表,一个订单时间表

    CREATE TABLE T_ORDER(
    ORDER_NUM INT PRIMARY KEY,
    ORDER_NAME CHAR(10) NOT NULL
    );
    CREATE TABLE T_ORDER_TIME(
    ORDER_NUM INT PRIMARY KEY,
    ORDER_TIME TIMESTAMP NOT NULL,
    )

    1、创建插入时的触发器

    CREATE TRIGGER TRI_INSERT
    AFTER INSERT ON T_ORDER FOR EACH ROW
    BEGIN
    INSERT INTO learning.t_order_time(ORDER_NUM,ORDER_TIME) VALUES(NEW.ORDER_NUM,NOW());
    END
    然后订单表中插入一条数据
    INSERT INTO T_ORDER(ORDER_NUM,ORDER_NAME) VALUES(1,'电脑');
    SELECT * FROM t_order;
    SELECT * FROM t_order_time;
    这是订单表中插入的数据:


    这是订单时间表中自己主动插入的数据:


    2、更新时插入数据

    //更新创建触发器
    CREATE TRIGGER TRI_UPDATA
    BEFORE UPDATE ON T_ORDER FOR EACH ROW
    BEGIN
    UPDATE  learning.t_order_time SET ORDER_TIME=NOW() WHERE OLD.ORDER_NUM=ORDER_NUM;
    END
    
    UPDATE T_ORDER  SET ORDER_NAME='饼干饼' WHERE ORDER_NUM=1;
    SELECT * FROM t_order;
    SELECT * FROM t_order_time;



    能够看到,时间已经更新

    3、创建删除触发器

    //创建删除触发器
    CREATE TRIGGER TRI_DELETE
    AFTER DELETE ON T_ORDER FOR EACH ROW
    BEGIN
    DELETE FROM  learning.t_order_time  WHERE OLD.ORDER_NUM=ORDER_NUM;
    END
    
    DELETE FROM  learning.t_order  WHERE ORDER_NUM=1;
    SELECT * FROM t_order;
    SELECT * FROM t_order_time;


    能够看到,数据库中都没有数据了。


    4、查看触发器

    查看触发器是指查看数据库中已存在的触发器的定义、状态和语法等信息。

    查看触发器的方法包含SHOW TRIGGERS语句和查询information_schema数据库下的triggers表等。

    本节将具体解说查看触发器的方法。

    MySQL中,能够运行SHOW TRIGGERS语句来查看触发器的基本信息。

    其基本形式例如以下:

    SHOW TRIGGERS ;


    MySQL中,全部触发器的定义都存在information_schema数据库下的triggers表中。查询triggers表。能够查看到数据库中全部触发器的具体信息。查询的语句例如以下:

    SELECT *  FROM  information_schema.triggers;


    5、删除触发器

    DROP TRIGGER 触发器名

    6、触发器 与存储过程
    触发程序不能调用将数据返回client的存储程序。也不能使用採用CALL语句的动态SQL
    (同意存储程序通过參数将数据返回触发程序)。
    而存储过程 能够接受參数,将结果范围给应用程序


  • 相关阅读:
    【洛谷】P1303 A*B Problem(高精度乘法模板)
    快速幂
    【洛谷】P1601 A+B Problem 高精(高精度加法模板)
    进制转换
    【洛谷】P1551 亲戚(并查集模板)
    求最大公约数的两种方法
    快速排序
    异或交换两个数
    数字字符串互相转换的三种方法
    Hello world(我来啦)
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6824614.html
Copyright © 2011-2022 走看看