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语句时,如果该表中有PRIMARY KEY或者UNIQUE唯一性约束时,首先就会检查插入的新数据是否违背唯一性约束,如果没有违背唯一性约束,则这时该条语句就和INSERT的作用一样,但是如果违背了唯一性约束,则会删除表中原有的相同数据(主键相同或者唯一性约束列值相同),进而加入新的数据。
LOAD DATA语句用于将一个文件中的数据连续的装载到一个数据库的表中,相当于一系列的INSERT操作。
在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中变量有两种,一种是局部变量,另一种是全局变量,局部变量只能在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用来表示触发器所在的表中,触发触发器的那一行数据改变前后的内容,具体的描述如下:
1.在INSERT触发器中,没有old对象,只有new对象,new对象表示的是将要(BEFORE)或已经(AFTER)插入的新数据。
2.在DELETE触发器中,没有new对象,只有old对象,old对象表示的是将要(BEFORE)或已经(AFTER)删除的旧数据。
3.在UPDATE触发器中,既有new对象,又有old对象,new对象表示的是将要(BEFORE)或已经(AFTER)更新的关联表的某一行的新数据,old对象表示的是将要(BEFORE)或已经(AFTER)更新的关联表的某一行的旧数据。