• 售前

  • 售后

热门帖子
入门百科

mysql 触发器用法实例详解

[复制链接]
荷叶224 显示全部楼层 发表于 2021-10-25 19:20:08 |阅读模式 打印 上一主题 下一主题
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触发步伐,这是因为,必要在将值用于更新行之前对其进行检查:
  1. mysql> delimiter //
  2. mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
  3.    -> FOR EACH ROW
  4.    -> BEGIN
  5.    -> IF NEW.amount < 0 THEN
  6.    -> SET NEW.amount = 0;
  7.    -> ELSEIF NEW.amount > 100 THEN
  8.    -> SET NEW.amount = 100;
  9.    -> END IF;
  10.    -> END;//
  11. mysql> delimiter ;
复制代码
     较为简单的方法是,单独定义存储步伐,然后使用简单的CALL语句从触发步伐调用存储步伐。如果你打算从数个触发步伐内部调用雷同的子步伐,该方法也很有帮助。在触发步伐的实行过程中,MySQL处理惩罚错误的方式如下:

     (1)如果BEFORE触发步伐失败,不实行相应行上的操纵。
     (2)仅当BEFORE触发步伐(如果有的话)和行操纵均已成功实行,才实行AFTER触发步伐。
     (3) 如果在BEFORE或AFTER触发步伐的实行过程中出现错误,将导致调用触发步伐的整个语句的失败。
     (4)对于事务性表,如果触发步伐失败(以及由此导致的整个语句的失败),该语句所实行的所有更改将回滚。对于非事务性表,不能实行这类回滚,因而,即使语句失败,失败之前所作的任何更改依然有用。

例一:
  1. mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
  2. mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;
复制代码
感谢阅读,希望能帮助到各人,谢谢各人对本站的支持!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作