A-A+

mysql trigger

2009年01月05日 学习随笔 暂无评论 阅读 1 次

mysql 5开始支持trigger

CREATE TRIGGER语法

CREATE TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt

触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与TEMPORARY表或视图关联起来。

trigger_time是触发程序的动作时间。它可以是BEFOREAFTER,以指明触发程序是在激活它的语句之前或之后触发。

trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

·         INSERT:将新行插入表时激活触发程序,例如,通过INSERTLOAD DATAREPLACE语句。

·         UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。

·         DELETE:从表中删除某一行时激活触发程序,例如,通过DELETEREPLACE语句。

请注意,trigger_event与以表操作方式激活触发程序的SQL语句并不很类似,这点很重要。例如,关于INSERTBEFORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。

可能会造成混淆的例子之一是INSERT INTO .. ON DUPLICATE UPDATE ...语法:BEFORE INSERT触发程序对于每一行将激活,后跟AFTER INSERT触发程序,或BEFORE UPDATEAFTER UPDATE触发程序,具体情况取决于行上是否有重复键。

对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一表,不能有两个BEFORE UPDATE触发程序。但可以有1BEFORE UPDATE触发程序和1BEFORE INSERT触发程序,或1BEFORE UPDATE触发程序和1AFTER UPDATE触发程序。

trigger_stmt是当触发程序激活时执行的语句。

例子如下:

use facebook_aboutme;

drop trigger facebook_aboutme.aboutme_insertopinion;

delimiter 
|

create trigger aboutme_insertopinion
after 
insert
on facebook_aboutme.opinion
for each row
begin
  
update users set  eye=eye+NEW.eye where userid=NEW.owner;
end|

delimiter ;

新的MySQL手册中把触发器和事务处理,存储过程等项完全独立开,目前trigger只能触发SQL语句。这个SQL语句受一定的语法限制:禁止使用下述语句(对存储函数的的所有限制也适用于触发程序)。

限制

* CHECK TABLES 
LOCK TABLES, UNLOCK TABLES 
* LOAD DATA, LOAD TABLE 
* SQL预处理语句(PREPARE、EXECUTE、DEALLOCATE PREPARE)。隐含意义:不能在存储子程序中使用动态SQL语句(其 中,能够以字符串形式构造动态语句,然后执行它们)。从MySQL 5.0.13开始,对于存储程序放宽了该限制,但该限制仍适用于存储函数和触发程序。
* OPTIMIZE TABLE 
* 执行显式或隐式提交或回滚操作的语句。
* 返回结果集的语句。包括没有INFO子句的SELECT语句,以及SHOW语句。能够用SELECT … INTO,或使用光标和FETCH语句处理结果集的函数。
* FLUSH语句。注意,尽管能够在存储程序中使用FLUSH,但不能从存储函数或触发程序调用这类存储程序。
注意,尽管某些限制在正常情况下适用于存储函数和触发程序,不适用于存储程序,如果它们是从存储函数或触发程序中调用的,这些限制也适用于存储程序。
使用存储子程序会导致复制问题。关于这方面的进一步讨论,请参见20.4节,“存储子程序和触发程序的二进制日志功能”(http: //dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#stored-procedure -logging)。
INFORMATION_SCHEMA尚不包含PARAMETERS表,因此,对于需要在运行时获取子程序参数信息的应用程序来说,必须采用相应的规避错误,如解析SHOW CREATE语句的输出。
没有存储子程序调试工具。
存储子程序使用了具体化的光标,而不是固有光标(在服务器端生成结果集并对结果集进行高速缓冲处理,然后在客户端获取结果集时按行返回)。
不能提前处理CALL语句。无论是对服务器端预处理语句还是SQL预处理语句,均成立。
为了防止服务器线程间的交互问题,当客户端发出语句时,服务器将使用可用的、用于语句执行的子程序和触发程序快照。也就是说,服务器将计算出可在语句执行 期间使用的存储程序、函数和触发程序的列表,加载它们,然后进入语句执行。这意味着,在语句执行的同时,它不会看到其他线程对子程序所作的变更。

总结:
mysql 的trigger 还是过于孱弱,据说还能造成数据库性能下降。不过mysql属于轻量级的,可以理解。

给我留言

Copyright © 浩然东方 保留所有权利.   Theme  Ality 07032740

用户登录