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

    3. 触发器 语法

        3.1  CREATE TRIGGER trigger_name trigger_time trigger_event

                  ON tbl_name FOR EACH ROW trigger_stmt

    trigger_time是触发程序的动作时间。它可以是BEFORE或AFTERtrigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

    ·             INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
    ·             UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
    ·             DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
          3.2 可能遇到的问题

                如果你在触发器里面对刚刚插入的数据进行了 insert/update, 会造成循环的调用.

                如:

                 create trigger test before update on test for each row update test set NEW.updateTime = NOW() where id=NEW.ID; END

                应该使用set:

                create trigger test before update on test for each row set NEW.updateTime = NOW(); END

         3.3 触发器 与存储过程

               触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL

           (允许存储程序通过参数将数据返回触发程序)。 

              而存储过程  可以接受参数,将结果范围给应用程序

    使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。
    在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用
    OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一
    行的列,也能使用NEW.col_name来引用更新后的行中的列。
    用OLD命名的列是只读的。你可以引用它,但不能更改它。对于用NEW命名的列,如果具有
    SELECT权限,可引用它。在BEFORE触发程序中,如果你具有UPDATE权限,可使用“SET NEW.
    col_name = value”更改它的值。这意味着,你可以使用触发程序来更改将要插入到新行中的值,
    或用于更新行的值。
    在BEFORE触发程序中,AUTO_INCREMENT列的NEW值为0,不是实际插入新记录时将自动生
    成的序列号。

    example1:

    创建表tab1

    1
    2
    3
    4
    DROP TABLE IF EXISTS tab1;
    CREATE TABLE tab1(
        tab1_id varchar(11)
    );

    创建表tab2

    1
    2
    3
    4
    DROP TABLE IF EXISTS tab2;
    CREATE TABLE tab2(
        tab2_id varchar(11)
    );


    创建触发器:t_afterinsert_on_tab1

    作用:增加tab1表记录后自动将记录增加到tab2表中

    1
    2
    3
    4
    5
    6
    7
    DROP TRIGGER IF EXISTS t_afterinsert_on_tab1;
    CREATE TRIGGER t_afterinsert_on_tab1
    AFTER INSERT ON tab1
    FOR EACH ROW
    BEGIN
         insert into tab2(tab2_id) values(new.tab1_id);
    END;

    测试一下

    1
    INSERT INTO tab1(tab1_id) values('0001');

    看看结果

    1
    2
    SELECT * FROM tab1;
    SELECT * FROM tab2;

    example2:

    创建触发器:t_afterdelete_on_tab1

    作用:删除tab1表记录后自动将tab2表中对应的记录删去

    1
    2
    3
    4
    5
    6
    7
    DROP TRIGGER IF EXISTS t_afterdelete_on_tab1;
    CREATE TRIGGER t_afterdelete_on_tab1
    AFTER DELETE ON tab1
    FOR EACH ROW
    BEGIN
          delete from tab2 where tab2_id=old.tab1_id;
    END;

    测试一下

    1
    DELETE FROM tab1 WHERE tab1_id='0001';

    看看结果

    1
    2
    SELECT * FROM tab1;
    SELECT * FROM tab2;
  • 相关阅读:
    INode满的处理方法
    分布式转码集群思路
    FreeBSD Set a Default Route / Gateway
    ssh遇到port 22:No route to host问题的解决方法
    debian 开启SSH
    virsh 查看信息
    virsh console配置
    virsh console hangs at the escape character “^]”
    virt-install命令---详解
    kmv 学习笔记 工具
  • 原文地址:https://www.cnblogs.com/sanxinglan/p/3417894.html
Copyright © 2011-2022 走看看