欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mysql之触发器Trigger

程序员文章站 2022-05-08 23:47:08
...

一、什么是触发器

   简单来说就是当某个表发生某些操作(插入、删除、更新)时,自动触发预先编译好的多条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 ('北京大学');

 结果如图所示

  Mysql之触发器Trigger


  现在开始添加触发器(触发器描述:创建一个触发器,当每向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 ;

最终的效果图:

 Mysql之触发器Trigger

  

 我感觉需要必须补充的一点就是 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`; 

   需要注意的是符号`

Mysql之触发器Trigger


  五、总结

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


相关标签: Mysql 触发器