Mysql之触发器Trigger

一、什么是触发器

   简单来说就是当某个表发生某些操作(插入、删除、更新)时,自动触发预先编译好的多条sql语句

二、创建触发器

   模式如:create trigger trigger_name 

                trigger_time 

                trigger_event on table_name 

                for each row 

                trigger_stmt

  简述四个参数trigger_name 、trigger_time、trigger_event 、trigger_stmt

    trigger_name : 触发器名称  用户自定义

    trigger_time: 触发时机  取值为before或者after

    trigger_event:触发事件  取值为select 、update、delete ....

    trigger_stmt:触发事件之后执行的sql语句,可以是单条也可以是多条sql语句

 由此可见可以建立6种触发器:before select 、 after select 、 before update 、after update 、 before delete 、after delete

 需要注意的是,在一个表上面不可以创建两个或者两个以上的相同类型的触发器,上面说的只是常见的类型,对于trigger_event的取值还有一些,因为我暂时还未遇到,这里就不载赘述,想了解的可以自己百度一下,我能做的就是把我会的总结下来展示给大家,让大家少走一些弯路。 

  对于trigger_stmt可以是单条sql语句也可以使用begin ... end 定义多条sql语句,这里对单条的就不多说了,和我们经常用的sql语句没什么差别,现在说一下begin ..... end的用法

   begin .... end:

      begin 

        [statement_list]

     end 

     其中statement_list就是多条sql语句,用分号隔开,也就是说分号暂时不能够作为结束符了,必须使用另外一种符号代替,可以使用&&来代替,这样的话,在创建触发器时就不会因为分号是结束符的问题,无法创建触发器,(简单来说创建整个触发器的过程就是一条sql语句,既然是sql语句就必须有结束符,又因为分号在这里只能作为一个statement_list的内容,所以必须换另外的结束符来代替分号),在创建触发器之前先声明一个新的结束符 使用delimiter 来实现  (比如我使用 && 来作为结束符  delimiter &&  后面不用加分号,就这些内容即可)

 创建触发器的实例:

  首要的条件是创建两个表:students和schools

    创建students的代码

create table students (id int not null primary key auto_increment , name varchar(100) not null , school_id int not null default 1 );

   创建schools的代码

create table schools (id int not null primary key auto_increment  , name varchar(100) not null , counts not null default 0);

  添加外键

alter table students add constraint student_school foreign key (school_id) references schools(id) ;

  给schools添加一条数据

insert into schools (name ) values ('北京大学');

 结果如图所示

  


  现在开始添加触发器(触发器描述:创建一个触发器,当每向students表中添加一条数据时,schools就加1)

  创建之前先将结束符改一下

delimiter &&
  创建触发器
create trigger student_school 
after 
insert on students for each row 
begin  
update schools set counts = counts + 1 where new.school_id = id; 
end &&

  最后将结束符变为 分号

  

delimiter ;

最终的效果图:

 

  

 我感觉需要必须补充的一点就是 new和old在触发器预处理sql语句中的应用

在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)

三、查看触发器

  show triggers [from schema_name]

四、删除触发器

   drop trigger [if exists] [schema_name.] `student_school`; 

   需要注意的是符号`



  五、总结

  其实我的目的是修改某个表中的数据时,通过修改的数据来改变该表中的另一个属性,比如:当某个商品卖完时(即:数量为0时),每次修改之后判断一下是否还有剩余库存,如果没有的话修改该商品的状态未已经卖完,否则为还有剩余。这个很明显的是在商品数量修改前后都可以判断,然后执行预定一点额sql语句来更新该商品的状态,但是很失望的是,结果我实现不了,大概意思好像是,这个表正在执行某个操作,无法再进行其他的操作,试了几遍之后,发现结果依然如此,我只好另辟蹊径,我想的办法是在执行update语句时,添加一个if函数,这个问题就完美的解决了,虽然没有用到触发器,但是还是在这里总结下来,希望可以帮到大家,如果大家对我的看法有什么问题,可以随时批我,会立马改正的


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值