志在指尖
用双手敲打未来

mysql触发器怎么写?什么作用?

mysql触发器怎么写?

delimiter$$
createtriggertest_tri
beforeinsertontest1
foreachrow
begin
setnew.id=(selectreplace(uuid(),’-‘,”));
end;$$
delimiter;

mysql触发器
mysql触发器什么作用?

MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器地点表上呈现指定事情时,将调用该对象,即表的操作事情触宣布上的触发器的履行。
创立触发器
在MySQL中,创立触发器语法如下:
代码如下:
CREATETRIGGERtrigger_name
trigger_time
trigger_eventONtbl_name
FOREACHROW
trigger_stmt
其间:
trigger_name:标识触发器称号,用户自行指定;
trigger_time:标识触发机遇,取值为BEFORE或AFTER;
trigger_event:标识触发事情,取值为INSERT、UPDATE或DELETE;
tbl_name:标识树立触发器的表名,即在哪张表上树立触发器;
trigger_stmt:触发器程序体,能够是一句SQL句子,或者用BEGIN和END包含的多条句子。
由此可见,能够树立6种触发器,即:BEFOREINSERT、BEFOREUPDATE、BEFOREDELETE、AFTERINSERT、AFTERUPDATE、AFTERDELETE。
别的有一个约束是不能一起在一个表上树立2个相同类型的触发器,因此在一个表上最多树立6个触发器。mysql
trigger_event详解
MySQL除了对INSERT、UPDATE、DELETE根本操作进行界说外,还界说了LOADDATA和REPLACE句子,这两种句子也能引起上述6中类型的触发器的触发。
LOADDATA句子用于将一个文件装入到一个数据表中,适当与一系列的INSERT操作。
REPLACE句子一般来说和INSERT句子很像,只是在表中有primarykey或unique索引时,假如刺进的数据和本来primarykey或unique索引一致时,会先删去本来的数据,然后增加一条新数据,也便是说,一条REPLACE句子有时候等价于一条。
INSERT句子,有时候等价于一条DELETE句子加上一条INSERT句子。
INSERT型触发器:刺进某一行时激活触发器,或许经过INSERT、LOADDATA、REPLACE句子触发;
UPDATE型触发器:更改某一行时激活触发器,或许经过UPDATE句子触发;
DELETE型触发器:删去某一行时激活触发器,或许经过DELETE、REPLACE句子触发。
BEGIN…END详解
在MySQL中,BEGIN…END句子的语法为:
BEGIN
[statement_list]
END
其间,statement_list代表一个或多个句子的列表,列表内的每条句子都必须用分号(;)来完毕。
而在MySQL中,分号是句子完毕的标识符,遇到分号表明该段句子现已完毕,MySQL能够开始履行了。因此,解释器遇到statement_list中的分号后就开始履行,然后会报出错误,因为没有找到和BEGIN匹配的END。
这时就会用到DELIMITER命令(DELIMITER是定界符,分隔符的意思),它是一条命令,不需求句子完毕标识,语法为:
DELIMITERnew_delemiter
new_delemiter能够设为1个或多个长度的符号,默许的是分号(;),咱们能够把它修正为其他符号,如$:
DELIMITER$
在这之后的句子,以分号完毕,解释器不会有什么反应,只要遇到了$,才认为是句子完毕。注意,运用完之后,咱们还应该记得把它给修正回来。
一个完好的创立触发器示例
假定体系中有两个表:
班级表class(班级号classID,班内学生数stuCount)
学生表student(学号stuID,所属班级号classID)
要创立触发器来使班级表中的班内学生数随着学生的增加自动更新,代码如下:
代码如下:
DELIMITER$
createtriggertri_stuInsertafterinsert
onstudentforeachrow
begin
declarecint;
setc=(selectstuCountfromclasswhereclassID=new.classID);
updateclasssetstuCount=c+1whereclassID=new.classID;
end$
DELIMITER;
变量详解
MySQL中运用DECLARE来界说一局部变量,该变量只能在BEGIN…END复合句子中运用,并且应该界说在复合句子的最初,
即其它句子之前,语法如下:
DECLAREvar_name[,…]type[DEFAULTvalue]
其间:
var_name为变量称号,同SQL句子相同,变量名不区别大小写;type为MySQL支持的任何数据类型;能够一起界说多个同类型的变量,用逗号隔开;变量初始值为NULL,假如需求,能够运用DEFAULT子句提供默许值,值能够被指定为一个表达式。
对变量赋值采用SET句子,语法为:
SETvar_name=expr[,var_name=expr]…
NEW与OLD详解
上述示例中运用了NEW关键字,和MSSQLServer中的INSERTED和DELETED类似,MySQL中界说了NEW和OLD,用来表明
触发器的地点表中,触发了触发器的那一行数据。
具体地:
在INSERT型触发器中,NEW用来表明即将(BEFORE)或现已(AFTER)刺进的新数据;
在UPDATE型触发器中,OLD用来表明即将或现已被修正的原数据,NEW用来表明即将或现已修正为的新数据;
在DELETE型触发器中,OLD用来表明即将或现已被删去的原数据;
运用方法:NEW.columnName(columnName为相应数据表某一列名)
别的,OLD是只读的,而NEW则能够在触发器中运用SET赋值,这样不会再次触发触发器,造成循环调用(如每刺进一个学生前,都在其学号前加“2013”)。
检查触发器
和检查数据库(showdatabases;)检查表格(showtables;)相同,检查触发器的语法如下:
SHOWTRIGGERS[FROMschema_name];
其间,schema_name即Schema的称号,在MySQL中Schema和Database是相同的,也便是说,能够指定数据库名,这样就
不必先“USEdatabase_name;”了。
删去触发器
和删去数据库、删去表格相同,删去触发器的语法如下:
DROPTRIGGER[IFEXISTS][schema_name.]trigger_name
触发器的履行次序
咱们树立的数据库一般都是InnoDB数据库,其上树立的表是事务性表,也便是事务安全的。这时,若SQL句子或触发器履行失利,MySQL会回滚事务,有:
①假如BEFORE触发器履行失利,SQL无法正确履行。
②SQL履行失利时,AFTER型触发器不会触发。
③AFTER类型的触发器履行失利,SQL会回滚

未经允许不得转载:IT技术网站 » mysql触发器怎么写?什么作用?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载