zoukankan      html  css  js  c++  java
  • mysql——触发器

    触发器的含义与作用

    触发器(trigger)是由事件来触发某个操作,主要是由insert update delete等事件来触发某种特定的条件;

    满足触发器的触发条件时,数据库就会执行触发器定义的程序语句,

    比如:当学生表当中增加了一个学生记录,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录。就执行一次计算学生的总数量的操作。这可以保证每次增加学生后的记录统计一直保持最新。


    触发器的定义语句

    # 单个执行语句的触发器

    create trigger 触发器名 after|before 触发事件
    on 表名 for each row
    执行语句

    # 多个执行语句的触发器

    delimiter &&   //把分隔符改成&&(当然了可以自定义为其他的)(注意有空格)
    
    create trigger 触发器名 after|before 触发事件  //after表示在触发事件之后执行语句;before表示在之前执行语句
    on 表名 for each row         //on表示在哪张表之上
    begin
    执行语句1;
    执行语句2;
    ........;
    end &&        //以&&表示结束这条语句
    
    delimiter ;   //把分隔符改回来(注意有空格)

    以一个简单的例子理解触发器

    A表 <--- 触发器t1 ---> B表
    当A表insert一条记录之后(触发事件),
    触发器将统计A表中的总记录数(执行语句1),并写入B表中(执行语句2),

    当用户每次想要得到A表的结果(总记录数),只需要到B表去查,从而避免了#select count(*) from A;这条语句的查询负担

    #创建A表
    create table A(
          userid int(10),
          username varchar(20),
          old int(4),
          address varchar(30));
    
    #创建B表
    create table B(
        insert_time time,   //insert_time属性用于记录insert的时间
        count int);         //count属性用于记录A表的总记录数
    
    #创建触发器t1的过程如下
    delimiter &&
    
    create trigger t1 after insert 
        on A for each row
        begin
        declare acount int;
        set acount=( select count(*) from A );
        insert into B values(now(),acount);
        end &&
    
    delimiter ;

    #验证:
    insert into A values('008','lyj88','100','gz');
    ......

    select * from B;
    +-------------+-------+
    | insert_time | count |
    +-------------+-------+
    | 00:41:39    |     5 |
    +-------------+-------+

    查看触发器信息的语句

    #查询当前数据库中的所有触发器信息
    show triggers G;
    
    #查询全部触发器的详细信息
    (所有触发器的信息都存在information_schema库中的triggers表里面)
    use information_schema;
    select * from information_schema.triggers G;
    
    #查询单个触发器的详细信息
    select * from triggers where trigger_name='product_af_delete'G;

    删除触发器的语句

    drop trigger 触发器名;

    一道练习题

     

    #创建product表
    create table product(
    id int(10) primary key not null unique,
    name varchar(20) not null,
    function varchar(50),
    company varchar(20) unique,
    address varchar(50)
    );
    
    #创建operate表
    create table operate(
    op_id int(10) not null,
    op_type varchar(20) not null,
    op_time time not null
    );
    
    #创建 product_bf_insert 触发器
    delimiter &&
    create trigger product_bf_insert before insert 
    on product for each row
    begin
    declare count1 int(10);
    set count1=( select count(*) from product );
    insert into operate values(count1,'insert',now());
    end &&
    delimiter ;
    
    #创建product_af_update触发器
    delimiter &&
    create trigger product_af_update after update
    on product for each row
    begin
    declare count2 int(10);
    set count2=( select count(*) from product );
    insert into operate values(count2,'update',now());
    end &&
    delimiter ;
    
    #创建product_af_delete触发器
    delimiter &&
    create trigger product_af_delete after delete 
    on product for each row
    begin
    declare count3 int(10);
    set count3=( select count(*) from product );
    insert into operate values(count3,'delete',now());
    end &&
    delimiter ;
    
    #执行inset、update、delete语句,可以在operate表中查询到相关的记录
    insert into product values(100,'p2','ko','google','ch');
    insert into product values(101,'p2','ko','baidu','ch');
    update product set function='ok' where id=100;
    delete from product where id=101;
    
    select * from operate;
    +-------+---------+----------+
    | op_id | op_type | op_time  |
    +-------+---------+----------+
    |     0 | insert  | 01:54:00 |
    |     1 | insert  | 03:15:32 |
    |     2 | update  | 03:21:44 |
    |     1 | delete  | 03:28:27 |
    +-------+---------+----------+
  • 相关阅读:
    第三次实验总结
    实验总结
    自我介绍
    BGP学习笔记
    source insight用于C语言编程的工具脚本
    LevelDB源码剖析
    LevelDB源码之五Current文件Manifest文件版本信息
    LevelDB源码之六缓存机制
    LevelDB源码之四LOG文件
    jQuery向动态生成的内容添加事件响应
  • 原文地址:https://www.cnblogs.com/snsdzjlz320/p/5734246.html
Copyright © 2011-2022 走看看