Mysql触发器与动态完整性

注:所有的下划线+斜体语句都是非必须语句

所有的大括号和"/"只是为了区分,并不属于sql语句


什么是触发器(Trigger):

如果想要在某些语句在事件发生前/后自动执行,那么就需要触发器,例如学生每选一门课,就让该同学选修课程的门数+1,或者在更新员工工资之前检查该员工工资是否仍然是最高工资等等,换句话说:Trigger是一种过程完整性约束 ( 相比之下,Create Table 中定义的都是非过程性约束), 是一段程序,该程序可以在特定的时刻被自动触发执行


用delimiter修改结束符:

sql语句:delimiter 自定义结束符

默认的结束符是分号,但有时会遇到一些问题,例如会与触发器中需要的分行起冲突,这个时候就要修改结束符,因为一般来讲,只要遇到第一个结束符,Mysql就会开始执行,而可能此时需要用户把这些语句全部输入完之后,再执行整段语句才行

可以在之后改回分号以避免错误,例如:

delimiter $$
select * from infer$$
select * from sc$$
delimiter ;

上下两个语句功能完全一样

扫描二维码关注公众号,回复: 176992 查看本文章
select * from infer;
select * from sc;


触发器的定义:

create trigger 触发器名字

{before / after}  {insert / update / delete} on 表名

for each row  when 检查用表达式

begin

一堆语句,用分号隔开(别忘了这个分号不是结束符,如果不修改默认结束符这里会出BUG)

end

文字描述:

{before / after}  {insert / update 一排列名 / delete} on 表名:显然总共六种组合,表示在插入/更新/删除之前执行下述操作或者插入/更新/删除之后执行下述操作


  • load data:将文件的内容插入到表中,相当于是insert语句
  • replace:一般的情况下和insert差不多,但表中若存在primary或者unique索引的时候,如果插入的数据和原来的primary key或者unique相同的时候,会删除原来的数据,然后增加一条新的数据,所以有的时候执行一条replace语句相当于执行了一条delete和insert语句

for each row  when 检查用表达式:对更新操作的每一条结果,检查是否满足When语句后面的条件,如果满足执行下面的BEGIN~END语句,否则不执行,注意BEGIN~END语句中定义的变量只能在BEGIN~END中使用,作用域为局部作用域

new和old的使用:



触发器的查询和删除:

查询:show triggers;

注意m上述语句无法查询指定的触发器

删除触发器:drop trigger if exists 触发器名


insert触发器样例:

对于表infer(St, sex, name, num),num为某同学选修课程个数,初始值为0,以后他每选修一门都要对其增1,设计一个触发器自动完成上述功能,选修情况表sc(st, ct, score)



delete触发器样例:

对于表infer(St, sex, name, num),num为某同学选修课程个数,以后他每一门课结课都要对其减1,设计一个触发器自动完成上述功能,选修情况表sc(st, ct, score)

delimiter $$
create trigger incnum
after delete on sc
for each row
begin 
    update infer set num = num-1
    where infer.st = old.st;
end$$
delimiter ;

delete from sc
where st = '20151602' and ct = '005' and score = 44;	
select * from sc;
select * from infer;


update触发器样例:

假设infer(St, name, sex, num)中某一学生要变更其主码St(学号),那么sc(St, Ct, score)表中该同学已选课记录的St也应该自动随其改变,设计一个触发器完成上述功能

delimiter $$
create trigger updst
after update on infer
for each row
begin
    update sc
    set st = new.st where st = old.st;
end$$
delimiter ;
update infer
set st = '20151607' where st = '20151601';


总结:


猜你喜欢

转载自blog.csdn.net/jaihk662/article/details/80213964