zoukankan      html  css  js  c++  java
  • 触发程序

    1. CREATE TRIGGER语法

    CREATE TRIGGER trigger_name trigger_time trigger_event
        ON tbl_name FOR EACH ROW trigger_stmt

    触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

    触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与TEMPORARY表或视图关联起来。

    trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

    trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

    ·         INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。

    ·         UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。

    ·         DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。

    2.“BEGIN ... END复合语句”  直接上程序

       1.先创建4个数据表

    1 CREATE TABLE test1(a1 INT);
    2 CREATE TABLE test2(a2 INT);
    3 CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);//表三的a3为主码,自增
    4 CREATE TABLE test4(
    5   a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    6   b4 INT DEFAULT 0   //表4的b4默认都为0
    7 );

       2.触发器testref 的定义

    DELIMITER |
     
    CREATE TRIGGER testref BEFORE INSERT ON test1
      FOR EACH ROW BEGIN
        INSERT INTO test2 SET a2 = NEW.a1;//把数据表1的数据复制到数据表2
        DELETE FROM test3 WHERE a3 = NEW.a1;  //删除数据表3中与表1相同的数据
        UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;//把数据表4 b4的相应内容在原基础上加1,条件为与表1 a1 相同的数据项
      END
    |
     
    DELIMITER ;

       3. 给表3,表4插入数据。

    INSERT INTO test3 (a3) VALUES 
      (NULL), (NULL), (NULL), (NULL), (NULL), 
      (NULL), (NULL), (NULL), (NULL), (NULL);
    INSERT INTO test4 (a4) VALUES 
      (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);

    如果将下述值插入表test1,如下所示:

    mysql> INSERT INTO test1 VALUES 
        -> (1), (3), (1), (7), (1), (8), (4), (4);
    Query OK, 8 rows affected (0.01 sec)
    Records: 8  Duplicates: 0  Warnings: 0

    那么4个表中的数据如下:

    mysql> SELECT * FROM test1;
    +------+
    | a1   |
    +------+
    |    1 |
    |    3 |
    |    1 |
    |    7 |
    |    1 |
    |    8 |
    |    4 |
    |    4 |
    +------+
    8 rows in set (0.00 sec)
     
    mysql> SELECT * FROM test2;
    +------+
    | a2   |
    +------+
    |    1 |
    |    3 |
    |    1 |
    |    7 |
    |    1 |
    |    8 |
    |    4 |
    |    4 |
    +------+
    8 rows in set (0.00 sec)
     
    mysql> SELECT * FROM test3;
    +----+
    | a3 |
    +----+
    |  2 |
    |  5 |
    |  6 |
    |  9 |
    | 10 |
    +----+
    5 rows in set (0.00 sec)
     
    mysql> SELECT * FROM test4;
    +----+------+
    | a4 | b4   |
    +----+------+
    |  1 |    3 |
    |  2 |    0 |
    |  3 |    1 |
    |  4 |    2 |
    |  5 |    0 |
    |  6 |    0 |
    |  7 |    1 |
    |  8 |    1 |
    |  9 |    0 |
    | 10 |    0 |
    +----+------+
    10 rows in set (0.00 sec)

    使用别名OLD和NEW,能够引用与触发程序相关的表中的列。OLD.col_name在更新或删除它之前,引用已有行中的1列。NEW.col_name在更新它之后引用将要插入的新行的1列或已有行的1列。

    激活触发程序时,对于触发程序引用的所有OLD和NEW列,需要具有SELECT权限,对于作为SET赋值目标的所有NEW列,需要具有UPDATE权限。

  • 相关阅读:
    ASP.NET MVC & EF 构建智能查询 二、模型的设计与ModelBinder
    ASP.NET MVC & EF 构建智能查询 一、智能查询的需求与设计
    在ASP.NET中自动合并小图片并使用CSS Sprite显示出来
    Entity Framework with MySQL Provider 更新行数为0的Bug
    为ASP.NET MVC 2.0添加Razor模板引擎 (on .NET4)
    ASP.NET MVC 2.0 in Vs2010 :使用C# 4.0中使用动态类型来传递ViewData
    问题贴
    Visual Studio 2010 RC 下安装ASP.NET MVC 2.0 RTM
    Microsoft Ajax CDN与Google Ajax CDN 你来试试哪个快
    ASP.NET MVC & EF 构建智能查询 三、解析QueryModel
  • 原文地址:https://www.cnblogs.com/xs-yqz/p/4931179.html
Copyright © 2011-2022 走看看