一、什么是触发器
简单来说就是当某个表发生某些操作(插入、删除、更新)时,自动触发预先编译好的多条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函数,这个问题就完美的解决了,虽然没有用到触发器,但是还是在这里总结下来,希望可以帮到大家,如果大家对我的看法有什么问题,可以随时批我,会立马改正的