您的位置:首页 > 其它

5.0新特性教程触发器:第一讲

2008-04-30 12:54 495 查看
作者:mysqlAB;翻译:陈朋奕
ConventionsandStyles约定和风格
  每次我想要演示实际代码时,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样(让大家区别程序代码和正文)。在这里举个例子:

mysql>DROPFUNCTIONf;
QueryOK,0rowsaffected(0.00sec)
  如果实例比较大,则需要在某些行和段落间加注释,同时我会用将"<--"符号放在页面的右边以表示强调。例如:

mysql>CREATEPROCEDUREp()
->BEGIN
->/*Thisproceduredoesnothing*/<--
->END;//
QueryOK,0rowsaffected(0.00sec)
  有时候我会将例子中的"mysql>"和"->"这些系统显示去掉,你可以直接将代码复制到mysql客户端程序中(如果你现在所读的不是电子版的,可以在mysql.com下载相关脚本)
  所以的例子都已经在Suse9.2、Mysql5.0.3公共版上测试通过。在您阅读本书的时候,Mysql已经有更高的版本,同时能支持更多OS了,包括Windows,Sparc,HP-UX。因此这里的例子将能正常的运行在您的电脑上。但如果运行仍然出现故障,可以咨询你认识的资深Mysql用户,这样就能得到比较好的支持和帮助。
WhyTriggers为什么要用触发器
  我们在MySQL5.0中包含对触发器的支持是由于以下原因:
  MySQL早期版本的用户长期有需要触发器的要求。
  我们曾经许诺支持所有ANSI标准的特性。
  您可以使用它来检查或预防坏的数据进入。
  您可以改变或者取消INSERT,UPDATE以及DELETE语句。
  您可以在一个会话中监视数据改变的动作。
  在这里我假定大家都读过"MySQL新特性"丛书的第一集--"MySQL存储过程",那么大家都应该知道MySQL至此存储过程和函数,那是很重要的知识,因为在触发器中你可以使用在函数中使用的语句。特别举个例子:
  复合语句(BEGIN/END)是合法的.
  流控制(Flow-of-control)语句(IF,CASE,WHILE,LOOP,WHILE,REPEAT,LEAVE,ITERATE)也是合法的.
  变量声明(DECLARE)以及指派(SET)是合法的.
  允许条件声明.
  异常处理声明也是允许的.
  但是在这里要记住函数有受限条件:不能在函数中访问表.因此在函数中使用以下语句是非法的。

ALTER'CACHEINDEX'CALLCOMMITCREATEDELETE
DROP'FLUSHPRIVILEGES'GRANTINSERTKILL
LOCKOPTIMIZEREPAIRREPLACEREVOKE
ROLLBACKSAVEPOINT'SELECTFROMtable'
'SETsystemvariable''SETTRANSACTION'
SHOW'STARTTRANSACTION'TRUNCATEUPDATE
  在触发器中也有完全一样的限制.
  触发器相对而言比较新,因此会有(bugs)缺陷.所以我在这里给大家警告,就像我在存储过程书中所说那样.不要在含有重要数据的数据库中使用这个触发器,如果需要的话在一些以测试为目的的数据库上使用,同时在你对表创建触发器时确认这些数据库是默认的。
Syntax语法
  1.Syntax:Name语法:命名规则

CREATETRIGGER<触发器名称><--
{BEFORE|AFTER}
{INSERT|UPDATE|DELETE}
ON<表名称>
FOREACHROW
<触发器SQL语句>
  触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
  这里我有个习惯:就是用表的名字+'_'+触发器类型的缩写.因此如果是表t26,触发器是在事件UPDATE(参考下面的点(2)和(3))之前(BEFORE)的,那么它的名字就是t26_bu。

  2.Syntax:Time语法:触发时间

CREATETRIGGER<触发器名称>
{BEFORE|AFTER}<--
{INSERT|UPDATE|DELETE}
ON<表名称>
FOREACHROW
<触发的SQL语句>
  触发器有执行的时间设置:可以设置为事件发生前或后。1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: