【2017年整理】mysql 触发器语法简介

上传人:爱****1 文档编号:990907 上传时间:2017-05-24 格式:DOCX 页数:6 大小:17.54KB
返回 下载 相关 举报
【2017年整理】mysql 触发器语法简介_第1页
第1页 / 共6页
【2017年整理】mysql 触发器语法简介_第2页
第2页 / 共6页
【2017年整理】mysql 触发器语法简介_第3页
第3页 / 共6页
【2017年整理】mysql 触发器语法简介_第4页
第4页 / 共6页
【2017年整理】mysql 触发器语法简介_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《【2017年整理】mysql 触发器语法简介》由会员分享,可在线阅读,更多相关《【2017年整理】mysql 触发器语法简介(6页珍藏版)》请在金锄头文库上搜索。

1、mysql 触发器语法简介mysql 触发器语法简介 2011-03-14 1459tagmysql 触发器语法 fanglor 1.语法命名规则 CREATE TRIGGER 触发器名称- BEFOREAFTER INSERTUPDATEDELETE ON 表名称 FOR EACH ROW 触发器 SQL 语句 触发器必须有名字最多 64 个字符可能后面会附有分隔符.它和 MySQL 中其他对象的命名方式基本相象. 这里我有个习惯就是用表的名字_触发器类型的缩写.因此如果是表 t26 触发器是在事件 UPDATE 参考下面的点 2 和 3 之前 BEFORE 的那么它的名字就是 t26_bu

2、。 2.语法触发时间 CREATE TRIGGER 触发器名称 BEFOREAFTER- INSERTUPDATEDELETE ON 表名称 FOR EACH ROW 触发的 SQL语句 触发器有执行的时间设置可以设置为事件发生前或后BEFOREAFTER。 3.语法事件 CREATE TRIGGER 触发器名称 BEFOREAFTER INSERTUPDATEDELETE- ON 表名称 FOR EACH ROW 触发的 SQL 语句 同样也能设定触发的事件它们可以在执行 insert、update 或 delete 的过程中触发。 4.语法表 CREATE TRIGGER 触发器名称 BE

3、FOREAFTER INSERTUPDATEDELETE ON 表名称- FOR EACH ROW 触发的SQL 语句 触发器是属于某一个表的当在这个表上执行插入、更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。 5.语法步长触发间隔 CREATE TRIGGER 触发器名称 BEFOREAFTER INSERTUPDATEDELETE ON 表名称 FOR EACH ROW- 触发的SQL 语句 触发器的执行间隔 FOR EACH ROW 子句通知触发器 每隔一行执行一次动作而不是对整个表执行一次。 6.语法语句 CREATE TRIGGER 触发器名

4、称 BEFOREAFTER INSERTUPDATEDELETE ON 表名称 FOR EACH ROW 触发的 SQL语句- 触发器包含所要触发的 SQL 语句这里的语句可以是任何合法的语句 包括复合语句但是这里的语句受的限制和函数的一样。 Privileges 权限 你必须拥有相当大的权限才能创建触发器 CREATE TRIGGER。 如果你已经是 Root 用户那么就足够了。这跟 SQL 的标准有所不同。 因此在下一个版本的 MySQL 中 你完全有可能看到有一种叫做 CREATE TRIGGER 的新权限。 然后通过这样的方法赋予 GRANT CREATE TRIGGER ON 表名称

5、 TO 用户或用户列表 也可以通过这样收回权限 REVOKE CREATE TRIGGER ON 表名称 FROM 用户或用户列表 MySQL 触发器语法详解. 一 CREATE TRIGGER语法 CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 触发程序是与表有关的命名数据库对象当表上出现特定事件时将激活该对象。 触发程序与命名为 tbl_name 的表相关。tbl_name 必须引用永久性表。不能将触发程序与 TEMPORARY 表或视图关联起来。 tr

6、igger_time 是触发程序的动作时间。它可以是 BEFORE 或 AFTER 以指明触发程序是在激活它的语句之前或之后触发。 trigger_event 指明了激活触发程序的语句的类型。trigger_event 可以是下述值之一 INSERT 将新行插入表时激活触发程序例如通过INSERT、LOAD DATA 和 REPLACE 语句。 UPDATE 更改某一行时激活触发程序例如通过 UPDATE 语句。 DELETE 从表中删除某一行时激活触发程序例如通过 DELETE 和 REPLACE语句。 请注意 trigger_event 与以表操作方式激活触发程序的 SQL 语句并不很类似

7、这点很重要。例如 关于 INSERT的 BEFORE 触发程序不仅能被 INSERT 语句激活也能被 LOAD DATA 语句激活。 可能会造成混淆的例子之一是 INSERT INTO.ON DUPLICATE UPDATE.语法 BEFORE INSERT 触发程序对于每一行将激活后跟 AFTER INSERT 触发程序或 BEFORE UPDATE 和 AFTER UPDATE 触发程序具体情况取决于行上是否有重复键。 对于具有相同触发程序动作时间和事件的给定表不能有两个触发程序。例如对于某一表不 能有两个BEFORE UPDATE 触发程序。但可以有 1 个 BEFORE UPDATE

8、触发程序和 1 个 BEFORE INSERT 触发程序或 1 个 BEFORE UPDATE 触发程序和 1 个 AFTER UPDATE 触发程序。 trigger_stmt 是当触发程序激活时执行的语句。如果你打算执行多个语句可使用 BEGIN.END 复 合语句结构。这样就能使用存储子程序中允许的相同语句 二 DROP TRIGGER 语法 DROP TRIGGERschema_name.trigger_name 舍弃触发程序。方案名称 schema_name 是可选的。如果省略了 schema方案将从当前方 案中舍弃触发程序。 注释从MySQL 5.0.10 之前的 MySQL 版本

9、升级到 5.0.10 或更高版本时包括所有的 MySQL 5.1 版 本必须在升级之前舍弃所有的触发程序并在随后重新创建它们否则在升级之后 DROP TRIGGER 不工作。 DROP TRIGGER 语句需要 SUPER 权限。 三使用触发程序 在本节中介绍了在 MySQL 5.1 中使用触发程序的方法并介绍了在使用触发程序方面的限制。 触发程序是与表有关的命名数据库对象当表上出现特定事件时将激活该对象。在某些触发程 序的用法中可用于检查插入到表中的值或对更新涉及的值进行计算。 触发程序与表相关当对表执行 INSERT、DELETE 或 UPDATE 语句时将激活触发程序。可以将 触发程序设

10、置为在执行语句之前或之后激活。例如可以在从表中删除每一行之前或在更新了 每一行后激活触发程序。 要想创建触发程序或舍弃触发程序可使用CREATE TRIGGER 或 DROP TRIGGER 语句 触发程序不能调用将数据返回客户端的存储程序也不能使用采用 CALL 语句的动态 SQL 允许存储程序通过参数将数据返回触发程序。 触发程序不能使用以显式或隐式方式开始或结束事务的语句如 START TRANSACTION、COMMIT 或 ROLLBACK。 使用OLD 和 NEW 关键字能够访问受触发程序影响的行中的列 OLD和 NEW 不区分大小写。在 INSERT 触发程序中仅能使用NEW.c

11、ol_name 没有旧行。在 DELETE 触发程序中仅能使用OLD.col_name 没有新行。在 UPDATE 触发程序中可以使用OLD.col_name 来引用更新前的某一行的列也能使用NEW.col_name 来引用更新后的行中的列。用 OLD 命名的列是只读的。你可以引用它但不能更改它。对于用 NEW 命名的列如果具有 SELECT 权限可引用它。在 BEFORE 触发程序中如果你具有 UPDATE 权限可使用 SET NEW.col_namevalue更改它的值。这意味着你可以使用触发程序来更改将要插入到新行中的值或用于更新行的值。在 BEFORE 触发程序中AUTO_INCREM

12、ENT 列的 NEW 值为 0 不是实际插入新记录时将自动生成的序列号。 通过使用 BEGIN.END 结构能够定义执行多条语句的触发程序。在 BEGIN 块中还能使用存储子程序中允许的其他语法如条件和循环等。但是正如存储子程序那样定义执行多条语句的触发程序时如果使用 mysql 程序来输入触发程序需要重新定义语句分隔符以便能够在触发程序定义中使用字符。在下面的示例中演示了这些要点。在该示例中定义了 1 个 UPDATE 触发程序用于检查更新每一行时将使用的新值并更改值使之位于 0100 的范围内。它必须是 BEFORE 触发程序这是因为需要在将值用于更新行之前对其进行检查 mysql del

13、imiter/ mysql CREATE TRIGGER upd_check BEFORE UPDATE ON account -FOR EACH ROW -BEGIN -IF NEW.amount 0THEN -SET NEW.amount0 -ELSEIF NEW.amount 100 THEN -SET NEW.amount100 -END IF -END/ mysql delimiter 较为简单的方法是单独定义存储程序然后使用简单的 CALL 语句从触发程序调用存储程序。如果你打算从数个触发程序内部调用相同的子程序该方法也很有帮助。在触发程序的执行过程中 MySQL 处理错误的方式如

14、下 如果 BEFORE 触发程序失败不执行相应行上的操作。 仅当 BEFORE 触发程序如果有的话和行操作均已成功执行才执行 AFTER 触发程序。 如果在 BEFORE 或AFTER 触发程序的执行过程中出现错误将导致调用触发程序的整个语句的失败。 对于事务性表如果触发程序失败以及由此导致的整个语句的失败该语句所执行的所有更改将回滚。对于非事务性表不能执行这类回滚因而即使语句失败失败之前所作的任何更改依然有效。 例一mysql CREATE TABLE accountacct_num INTamount DECIMAL102 mysql CREATE TRIGGER ins_sum BEFORE INSERT ON account -FOR EACH ROW SETsumsumNEW.amount

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号