MySQL触发器语法详解:
触发器 trigger是一种特别的存储历程,他在插进去(inset)、删除(delete)或修正(update)特定表中的数据时触发实行,它比数据自身规范的功用更邃密和更庞杂的数据控制能力。触发器不是由顺序挪用,而是由某个事宜来触发的。在有数据修正时自动强迫实行其营业划定规矩,常常用于增强数据的完整性束缚和营业划定规矩等。触发器可以查询其他表,而且包含复制的sql语句。触发器也可用于强迫援用完整性。触发器可以强迫比用check束缚定义的束缚更加庞杂的束缚。
(一).CREATE TRIGGER语法
CREATE TRIGGER trigger_nametrigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt;
触发顺序是与表有关的定名数据库对象,当表上涌现特定事宜时,将激该死对象。
触发顺序与定名为tbl_name的表相干。tbl_name必需援用永久性表。不能将触发顺序与TEMPORARY表或视图关联起来。
trigger_time是触发顺序的行动时候。它可以是BEFORE或AFTER,以指明触发顺序是在激活它的语句之前或以后触发。
trigger_event指清楚明了激活触发顺序的语句的范例。trigger_event可以是下述值之一:
(1).INSERT:将新行插进去表时激活触发顺序,比方,经由过程INSERT、LOAD DATA和REPLACE
语句。
(2).UPDATE:变动某一行时激活触发顺序,比方,经由过程UPDATE语句。
(3).DELETE:从表中删除某一行时激活触发顺序,比方,经由过程DELETE和REPLACE语句。
请注意,trigger_event与以表操纵体式格局激活触发顺序的SQL语句并不很相似,这点很主要。比方,关于INSERT的BEFORE触发顺序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。可能会形成殽杂的例子之一是INSERT INTO .. ON DUPLICATE UPDATE ...语法:BEFORE INSERT触发顺序关于每一即将激活,后跟AFTER INSERT触发顺序,或BEFORE UPDATE和AFTER UPDATE触发顺序,具体情况取决于行上是不是有反复键。
关于具有雷同触发顺序行动时候和事宜的给定表,不能有两个触发顺序。比方,关于某一表,不能有两个BEFORE UPDATE触发顺序。但可以有1个BEFORE UPDATE触发顺序和1个BEFORE INSERT触发顺序,或1个BEFOREUPDATE触发顺序和1个AFTER UPDATE触发顺序。trigger_stmt是当触发顺序激活时实行的语句。假如你盘算实行多个语句,可运用BEGIN ... END复合语句构造。如许,就可以运用存储子顺序中许可的雷同语句
(二).DROP TRIGGER语法
DROP TRIGGER[schema_name.]trigger_name舍弃触发顺序。计划称号(schema_name)是可选的。假如省略了schema(计划),将从当前计划中舍弃触发顺序。
解释:从MySQL 5.0.10之前的MySQL版本升级到5.0.10或更高版本时(包含一切的MySQL5.1版本),必需在升级之前舍弃一切的触发顺序,并在随后从新建立它们,不然,在升级以后DROP TRIGGER不事情。DROP TRIGGER语句须要SUPER权限。
(三).运用触发顺序
在本节中,引见了在MySQL 5.1中运用触发顺序的要领,并引见了在运用触发顺序方面的限定。
触发顺序是与表有关的定名数据库对象,当表上涌现特定事宜时,将激该死对象。在某些触发顺序的用法中,可用于搜检插进去到表中的值,或对更新触及的值举行盘算。
触发顺序与表相干,当对表实行INSERT、DELETE或UPDATE语句时,将激活触发顺序。可以将触发顺序设置为在实行语句之前或以后激活。比方,可以在从表中删除每一行之前,或在更新了,每一行后激活触发顺序。要想建立触发顺序或舍弃触发顺序,可运用CREATE TRIGGER或DROP TRIGGER语句.触发顺序不能挪用将数据返回客户端的存储顺序,也不能运用采纳CALL语句的动态SQL(许可存储顺序经由过程参数将数据返回触发顺序)。
触发顺序不能运用以显式或隐式体式格局最先或完毕事件的语句,如START TRANSACTION、
COMMIT或ROLLBACK。
运用OLD和NEW关键字,可以接见受触发顺序影响的行中的列(OLD和NEW不辨别大小写)。
在INSERT触发顺序中,仅能运用NEW.col_name,没有旧行。在DELETE触发顺序中,仅能运用OLD.col_name,没有新行。在UPDATE触发顺序中,可以运用OLD.col_name来援用更新前的某一行的列,也能运用NEW.col_name来援用更新后的行中的列。
用OLD定名的列是只读的。你可以援用它,但不能变动它。关于用NEW定名的列,假如具有SELECT权限,可援用它。在BEFORE触发顺序中,假如你具有UPDATE权限,可运用“SET NEW.col_name = value”变动它的值。这意味着,你可以运用触发顺序来变动将要插进去到新行中的值,或用于更新行的值。在BEFORE触发顺序中,AUTO_INCREMENT列的NEW值为0,不是现实插进去新纪录时将自动生成的序列号。
经由过程运用BEGIN ...END构造,可以定义实行多条语句的触发顺序。在BEGIN块中,还能运用存储子顺序中许可的其他语法,如前提和轮回等。然则,正如存储子顺序那样,定义实行多条语句的触发顺序时,假如运用mysql顺序来输入触发顺序,须要从新定义语句分隔符,以便可以在触发顺序定义中运用字符“;”。鄙人面的示例中,演示了这些要点。在该示例中,定义了1个UPDATE触发顺序,用于搜检更新每一行时将运用的新值,并变动值,使之位于0~100的范围内。它必需是BEFORE触发顺序,这是由于,须要在将值用于更新行之前对其举行搜检:
mysql> delimiter // mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account -> FOR EACH ROW -> BEGIN -> IF NEW.amount < 0 THEN -> SET NEW.amount = 0; -> ELSEIF NEW.amount > 100 THEN -> SET NEW.amount = 100; -> END IF; -> END;// mysql> delimiter ;
较为简朴的要领是,零丁定义存储顺序,然后运用简朴的CALL语句从触发顺序挪用存储顺序。假如你盘算从数个触发顺序内部挪用雷同的子顺序,该要领也很有协助。在触发顺序的实行历程当中,MySQL处置惩罚毛病的体式格局以下:
(1)假如BEFORE触发顺序失利,不实行响应行上的操纵。
(2)仅当BEFORE触发顺序(假如有的话)和行操纵均已胜利实行,才实行AFTER触发顺序。
(3) 假如在BEFORE或AFTER触发顺序的实行历程当中涌现毛病,将致使挪用触发顺序的全部语句的失利。
(4)关于事件性表,假如触发顺序失利(以及由此致使的全部语句的失利),该语句所实行的一切变动将回滚。关于非事件性表,不能实行这类回滚,因此,纵然语句失利,失利之前所作的任何变动依旧有用。
例一:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;
相干引荐:
Mysql触发器在PHP项目中用来做信息备份、恢复和清空
关于MySQL触发器的题目
mysql触发器简介及怎样建立和删除触发器
以上就是mysql 触发器用法实例分享的细致内容,更多请关注ki4网别的相干文章!