MySQL触发器

发布时间:2024年01月14日
触发器操作实例
DELIMITER $
CREATE TRIGGER USERGOOD AFTER UPDATE ON USER FOR EACH ROW
BEGIN 
	IF(old.USERID > 20)
		THEN INSERT INTO GOOD(NEWNUM,OLDNUM) VALUES (new.USERNAME,old.USERNAME);
	ELSE
		THEN INSERT INTO GOOD(NEWNUM,OLDNUM) VALUES('小于20','小于20'); 
	END IF;
END $
DELIMITER ;

#查看数据库中的触发器
SHOW TRIGGERS;
#删除触发器
DROP TRIGGER USERGOOG;#(触发器名称)

注:在mysql数据库中没有修改触发器的说法,通常来说需要修改触发器,则需要删除同名触发器,在创建触发器。
语法说明
CREATE TRIGGER trigger_name AFTER|BEFORE trigger_event ON table_name FOR EACH ROW
trigger_stmt

trigger_name:触发器名称
trigger_event:触发事件,通常有INSERT|DELETE|UPDATE,另外还有不常见的REPLACE|LOAD DATA
trigger_stmt:触发程序体,可以是一条sql语句,也可以是由BEGIN和END包含的多条和语句块。
REPLACE|INSERT的区别

REPLACE语句和INSERT语句很像,唯一的区别就是使用REPLACE语句时,如果该表中有PRIMARY KEY或者UNIQUE唯一性约束时,首先就会检查插入的新数据是否违背唯一性约束,如果没有违背唯一性约束,则这时该条语句就和INSERT的作用一样,但是如果违背了唯一性约束,则会删除表中原有的相同数据(主键相同或者唯一性约束列值相同),进而加入新的数据。

LOAD DATA说明

LOAD DATA语句用于将一个文件中的数据连续的装载到一个数据库的表中,相当于一系列的INSERT操作。

BEGIN和END详解

在MySQL中,BEGIN和END的语法为:

BEGIN
	statement_list
END

其中statemet_list代表一个或多个语句列表,列表内的每天数据都必须以分号[;]结尾。而在MySQL中,分号是语句结束的标识符。遇到分号表示该段语句已经结束,MySQL可以开始执行了,因此解释器遇到statement_list中的分号就开始执行,然后会报错误,因为没有找到和BEGIN相匹配的END。

这时就会用到定界符命令DELIMITER,由于定界符是命令,因此不需要语句结束标识,语法为:

DELIMITER new_delimiter

new_delimiter可以为一个或多个长度的符号,其默认是分号(这也就是与BENGIN和END语句结束符冲突的原因),可以设置为其他符号,如DELIMITER $$

通过上述方式设置后,BEGIN和END中的语句以分号作为结束标志,解释器不会有啥反应,只有遇到$$才认为语句结束,可以开始执行,但需要注意的是使用完之后还需要修改回来。

MySQL中关于变量的定义

在MySQL中变量有两种,一种是局部变量,另一种是全局变量,局部变量只能在BEGIN和END语句块中定义,并且必须定义在语句块的开头,其语法为:

DECLARE 变量名 变量类型 DEFAULT 默认值

定义全局变量的语法为:

SET @变量名 = 值

注意:变量名不区分大小写,一次定义多个变量时中间采用逗号作为分隔。示例如下:

定义局部变量: DECLARE UUF INT DEFAULT 1
定义全局变量: SET @p_int = 1;
赋值: set p_int = 10;
查询变量值: SELECT p_int;
触发器的执行顺序

通常来说,MySQL数据库一般都是InNoDB数据库,因此数据库上的表是事务性表,也就是事务安全的,这是若SQL语句或者触发器执行失败,MySQL会有事务回滚,其情况一般有如下几种:

1.对于BEFORE触发器,如果触发器程序体执行失败,则SQL不执行。
2.对于BEFORE触发器,如果触发器程序体执行成功,而SQL执行失败,会执行SQL回滚。

1.对于AFTER触发器,如果触发器程序体执行失败,SQL语句不会执行。
2.对于AFTER触发器,如果触发器程序体执行成功,SQL语句执行失败,会执行SQL回滚。

注意:上述的触发器程序体和SQL区分,触发器程序体是触发器的BEGIN和END之间的SQl语句,而SQL指的是对触发器关联表操作的SQL语句。
MySQL中new和old对象详解

在mysql中定义了new和old用来表示触发器所在的表中,触发触发器的那一行数据改变前后的内容,具体的描述如下:

1.在INSERT触发器中,没有old对象,只有new对象,new对象表示的是将要(BEFORE)或已经(AFTER)插入的新数据。
2.在DELETE触发器中,没有new对象,只有old对象,old对象表示的是将要(BEFORE)或已经(AFTER)删除的旧数据。
3.在UPDATE触发器中,既有new对象,又有old对象,new对象表示的是将要(BEFORE)或已经(AFTER)更新的关联表的某一行的新数据,old对象表示的是将要(BEFORE)或已经(AFTER)更新的关联表的某一行的旧数据。
文章来源:https://blog.csdn.net/weixin_44487537/article/details/135505463
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。