zoukankan      html  css  js  c++  java
  • mysql 触发器(trigger)

    触发器(trigger):监视某种情况,并触发某种操作。

    触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件

    语法:

    CREATE TRIGGER trigger_name trigger_time trigger_event
        ON tbl_name FOR EACH ROW trigger_stmt

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

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

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

       insert :将新行插入表时激活触发程序,例如,通过insert、load data和replace语句。

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

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

    要注意,trigger_event与以表操作方式激活触发程序的SQL语句并不很类似,这点很重要。

    例如:关于insert的before触发程序不仅能被insert语句激活,也能被load data语句激活。

    create trigger triggerName

    after/before insert/update/delete on 表名

    for each row   #这句话在mysql是固定的

    begin

    sql语句;

    end;


    对于insert语句, 只有new是合法的;

    对于delete语句,只有old才合法;

    对于update语句,newold可以同时使用。


    创建表(触发器要操作的两张表)

    /*auto_increment:自增;priamry key :主键;comment:注释*/

    /* drop:删除;if exists xxx(判断xxx名在数据库时候是否出存在xxx名称)*/

    /* for each row :循环一行一行的执行数据 */

    /* after insert/update/delete on table_name :针对哪个表执行的insert/update/delete 操作 */

    drop table if exists table1;
    
    create table table1(
    id int(4) primary key auto_increment not null comment 'id',
    name varchar(225) comment '名字'
    );
    
    drop table if exists table2;
    create table table2(
    id int primary key auto_increment not null comment 'id',
    name varchar(225) comment '名字'
    );

    Before与After区别:

    before:(insert、update)可以对new进行修改,after不能对new进行修改,两者都不能修改old数据。

    insert 触发器

    drop trigger if exists insert_on_table1;
    create trigger insert_on_table1
    after insert  on table1
    for each row
    begin
    insert into table2(name) value(new.name);
    end

    操作触发器

    insert table1(name) value('aaa');

    查询table2是否有值

    select * from table2;

    delete触发器

    drop trigger if exists delete_on_table1;
    create trigger delete_on_table1
    after delete on table1
    for each ROW
    begin
    delete from table2 where name=old.name;
    end

    执行删除操作

    delete from table1 where id=1;

    查询table2变化

    select * from table2;

    更新table1更新触发器

    drop trigger if exists update_on_table1;
    create trigger update_on_table1
    after update on table1
    for each ROW
    begin
    update table2 set name=new.name where name=old.name;
    end

    执行更新操作

    update table1 set name='ccc';

    查询table2变化

    select * from table2;

     使用before 统计插入积分例子:

    创建表

    drop table if exists table3;
    create table table3(
    id int primary key auto_increment comment 'id',
    num int  comment '积分'
    )engine=myisam  default charset=utf8 comment='单独积分表';

    创建用函数变量接收的触发器

    drop trigger if exists insert_on_table3;
    create trigger insert_on_table3
    before insert on table3
    for each row 
    set @sum=@sum+new.num;

    执行触发器

    set @sum=0;
    insert into table3 values(1,2),(2,3),(3,3),(4,3);
    select @sum;
  • 相关阅读:
    azkaban使用--邮件发送配置
    azkaban使用--schedule定时任务
    azkaban使用--传入动态参数
    GET和POST区别
    微信小程序与java后台交互
    java中的锁分类
    对CAS机制的理解(二)
    对CAS机制的理解(一)
    Spring中Model、ModelMap及ModelAndView之间的区别
    MySQL命令行导入.sql文件遇到的问题
  • 原文地址:https://www.cnblogs.com/sztx/p/9499769.html
Copyright © 2011-2022 走看看