目录
二、触发器:顾名思义,触发器就是在对表进行插入,更新,删除操作时会触发的操作
一、补充知识:
1.1 AUTO_INCREMENT关键字(在尾部添加,放在主键后面):设置变量为自增变量
CREATE TABLE test
(
id int PRIMARY KEY AUTO_INCREMENT
)AUTO_INCREMENT = 100;
1.2 一般情况下,MySQL的默认是以; 作为结束执行语句,与触发器中需要的分行起冲突
解决办法:DELIMITER ||,可以将结束符号变成||
当触发器创建后,可用DELIMITER ; 进行还原
1.3 FOREIGN_KEY_CHECKS变量:用来控制外键约束,可设置为0取消外键约束,设置为1还原外键约束
create trigger updateBookName before update on book for each row
begin
SET FOREIGN_KEY_CHECKS = 0;
if(old.图书编号!=new.图书编号) then
update onsale set 图书编号=new.图书编号 where 图书编号=old.图书编号;
end if;
SET FOREIGN_KEY_CHECKS = 1;
end;$$
delimiter ;
二、触发器:顾名思义,触发器就是在对表进行插入,更新,删除操作时会触发的操作
2.1创建触发器
格式:在每个行的表名触发的操作之前/之后创建触发器名
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW BEGIN 执行语句列表 END
触发时间有俩种
before:在操作前触发
after:在操作后触发
触发事件有三种:
insert:insert触发进行操作,load data和replace也同样会触发操作。
update:update触发进行操作。
delete:删除触发进行操作,replace也会触发操作。
注意:对于一张表来说不能有俩个触发操作同样的触发器,只能各自有一个。
2.2删除触发器
drop trigger 器名
2.3触发器的俩个对象:old对象和new对象。
可用old和new对新纪录或旧纪录进行操作,比对。
insert触发器:会将待插入的记录写入new对象里,可在触发器里使用" new.列名 "调用数据
delete触发器:会将待删除的记录写入old对象里,可在触发器里使用" old.列名 "调用数据
update触发器:会将已存在旧记录写入old对象,马上更新记录写入new对象。
实验用的雇员数据表,数项设置为AUTO_INCREMENT自增属性,插入时自动增加。
//增加数列列的语句:alter table employee add column number int(1)primary key auto_increment;
可以知道当前人数有7位,假定我们设定只能存入七位职员数据,通过一个触发器inspeck判断插入前人数(数目)是否超过人数限制7位
delimiter ||
create trigger t1 before insert
for each row
begin
declare x int;
select count(id) into x from employee;
if(x > = 7)then
insert into bucunzai values(0); //目前的MySQL的没有抛出异常方法,设置一个语句
//插入不存在的表数据抛出异常
end if;
end;
delimiter ;
此时已知表中有六位职员,只能添加最后一位,达到触发器限制,会在添加前(之前)限制添加。
触发器可以使用的场景有很多,且具有一定逻辑性,例如:一张货物表,一张订单表,当添加一个新订单时需要检查货物数量是否达到订单要求,可以使用触发器在订单插入前检查另一表中数量。
最后,删除触发器,毕竟一张表同一类型的触发器只能有一个。
记得要将结束符改回来:DELIMITER;
相关章节:
(一)https://blog.csdn.net/qq_38487155/article/details/79475851
(二)https://blog.csdn.net/qq_38487155/article/details/79488478
(三)https://blog.csdn.net/qq_38487155/article/details/79508140