当前位置:首页 > 系统运维 > 正文内容

MySQL5触发器的实际操作功能有哪些?

a8116255316年前 (2010-06-13)系统运维13

此文章主要向大家介绍的是MySQL5触发器,每次我演示实际代码的时候会对MySQL(和PHP搭配之更佳组合)客户端的屏幕就出现的代码进行相关的调整,主要是将字体改成Courier,使他们看起来与普通文本不一样(让大家区别程序代码和正文)。

MySQL5触发器教程在这里举个例子:

MySQL(和PHP搭配之更佳组合)> DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)如果实例比较大,则需要在某些行和段落间加注释,同时我会用将"<--"符号放在页面的右边以表示强调。例如:

MySQL(和PHP搭配之更佳组合)> CREATE PROCEDURE p ()-> BEGIN-> /* This procedure does nothing */ <---> END;//Query OK, 0 rows affected (0.00 sec)有时候我会将例子中的"MySQL(和PHP搭配之更佳组合)>"和"->"这些系统显示去掉,你可以直接将代码复制到MySQL(和PHP搭配之更佳组合)客户端程序中(如果你现在所读的不是电子版的,可以在MySQL(和PHP搭配之更佳组合).com网站下载相关脚本) 所以的例子都已经在Suse 9.2 Linux、MySQL(和PHP搭配之更佳组合) 5.0.3公共版上测试通过。

在您阅读本书的时候,MySQL(和PHP搭配之更佳组合)已经有更高的版本,同时能支持更多OS了,包括windows,Sparc,HP-UX。因此这里的例子将能正常的运行在您的电脑上。但如果运行仍然出现故障,可以咨询你认识的资深MySQL(和PHP搭配之更佳组合)用户,这样就能得到比较好的支持和帮助。

为什么要用触发器

我们在MySQL(和PHP搭配之更佳组合) 5.0中包含对触发器的支持是由于以下原因:

MySQL(和PHP搭配之更佳组合)早期版本的用户长期有需要触发器的要求。我们曾经许诺支持所有ANSI标准的特性。您可以使用它来检查或预防坏的数据进入数据库。您可以改变或者取消INSERT, UPDATE以及DELETE语句。您可以在一个会话中监视数据改变的动作。

在这里我假定大家都读过"MySQL(和PHP搭配之更佳组合)新特性"丛书的之一集--"MySQL(和PHP搭配之更佳组合)存储过程",那么大家都应该知道MySQL(和PHP搭配之更佳组合)至此存储过程和函数,那是很重要的知识,因为在触发器中你可以使用在函数中使用的语句。特别举个例子:

复合语句(BEGIN / END)是合法的.流控制(Flow-of-control)语句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.变量声明(DECLARE)以及指派(SET)是合法的.允许条件声明.异常处理声明也是允许的.但是在这里要记住函数有受限条件:不能在函数中访问表.因此在函数中使用以下语句是非法的。

ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETEDROP   'FLUSH PRIVILEGES' GRANT INSERT KILLLOCK OPTIMIZE REPAIR REPLACE REVOKEROLLBACK   SAVEPOINT 'SELECT FROM table''SET system variable' 'SET TRANSACTION'SHOW 'START TRANSACTION'  TRUNCATE UPDATE  

在MySQL5触发器中也有完全一样的限制.触发器相对而言比较新,因此会有(bugs)缺陷.所以我在这里给大家警告,就像我在存储过程书中所说那样.不要在含有重要数据的数据库中使用这个触发器,如果需要的话在一些以测试为目的的数据库上使用,同时在你对表创建触发器时确认这些数据库是默认的。

语法

1. 语法:命名规则CREATE TRIGGER <触发器名称> <--{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名称>FOR EACH ROW<触发器SQL语句>触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL(和PHP搭配之更佳组合)中其他对象的命名方式基本相象.

这里我有个习惯:就是用表的名字+'_'+触发器类型的缩写.因此如果是表t26,触发器是在事件UPDATE(参考下面的点(2)和(3))之前(BEFORE)的,那么它的名字就是t26_bu。

2. 语法:

触发时间CREATE TRIGGER <触发器名称>{ BEFORE | AFTER } <--{ INSERT | UPDATE | DELETE }ON <表名称>FOR EACH ROW<触发的SQL语句>触发器有执行的时间设置:可以设置为事件发生前或后。

3. 语法:事件CREATE TRIGGER <触发器名称>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE } <--ON <表名称>FOR EACH ROW<触发的SQL语句>同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。

4. 语法:表CREATE TRIGGER <触发器名称>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名称> <--FOR EACH ROW<触发的SQL语句>触发器是属于某一个表的:当在这个表上执行插入、更新或删除操作的时候就导致触发器的激活.我们不能给同一张表的同一个事件安排两个触发器。

5. 语法:( 步长)触发间隔CREATE TRIGGER <触发器名称>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名称>FOR EACH ROW <--<触发的SQL语句>触发器的执行间隔:FOR EACH ROW子句通知触发器每隔一行执行一次动作,而不是对整个表执行一次。

6. 语法:语句CREATE TRIGGER <触发器名称>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名称>FOR EACH ROW<触发的SQL语句> <--触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句,包括复合语句,但是这里的语句受的限制和函数的一样。Privileges权限你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER)。

如果你已经是Root用户,那么就足够了。这跟SQL的标准有所不同。因此在下一个版本的MySQL(和PHP搭配之更佳组合)中,你完全有可能看到有一种叫做CREATE TRIGGER的新权限。然后通过这样的 *** 赋予:GRANT CREATE TRIGGER ON <表名称> TO <用户或用户列表>;也可以通过这样收回权限:REVOKE CREATE TRIGGER ON <表名称> FROM <用户或用户列表>;关于旧的和新创建的列的标识

在触发器的SQL语句中,你可以关联表中的任意列。但你不能仅使用列的名称去标识,那会使系统混淆,因为那里可能会有列的新名(这可能正是你要修改的,你的动作可能正是要修改列名),还有列的旧名存在。因此你必须用这样的语法来标识: "NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . column_name)新和旧的列名属于创建了过渡变量("transition variables")。

对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以在和NEW以及OLD同时使用。下面是一个UPDATE中同时使用NEW和OLD的例子。

CREATE TRIGGER t21_auBEFORE UPDATE ON t22FOR EACH ROWBEGINSET @old = OLD . s1;SET @new = NEW.s1;END; 

现在如果t21表中的s1列的值是55,那么执行了"UPDATE t21 SET s1 = s1 + 1"之后@old的值会变成55,而@new的值将会变成56。Example of CREATE and INSERT CREATE和INSERT的例子创建有MySQL5触发器的表这里所有的例程中我都假定大家的分隔符已经设置成//(DELIMITER //)。

CREATE TABLE t22 (s1 INTEGER)//CREATE TRIGGER t22_biBEFORE INSERT ON t22FOR EACH ROWBEGINSET @x = 'Trigger was activated!';SET NEW.s1 = 55;END;//在最开始我创建了一个名字为t22的表,然后在表t22上创建了一个触发器t22_bi,当大家要向表中的行插入时,触发器就会被激活,执行将s1列的值改为55的动作。

使用触发器执行插入动作

MySQL(和PHP搭配之更佳组合)> INSERT INTO t22 VALUES (1)//

让我们看如果向表t2中插入一行数据触发器对应的表会怎么样? 这里的插入的动作是很常见的,我们不需要触发器的权限来执行它。甚至不需要知道是否有触发器关联。

MySQL(和PHP搭配之更佳组合)> SELECT @x, t22.* FROM t22//+------------------------+------+|   @x | s1 |+------------------------+------+| Trigger was activated! | 55 |+------------------------+------+  1 row in set (0.00 sec)  

大家看到的是INSERT动作之后的结果,和我们预期的一样,x标记被改动了,同时这里插入的数据不是我们开始输入的插入数据,而是触发器自己的数据。

"check"完整性约束例子什么是"check"约束在标准的SQL语言中,我们可以在(CREATE TABLE)创建表的过程中使用"CHECK (condition)",例如:CREATE TABLE t25(s1 INT, s2 CHAR(5), Prima(最完善的虚拟主机管理系统)RY KEY (s1),CHECK (LEFT(s2,1)='A'))ENGINE=INNODB;这里CHECK的意思是"当s2列的最左边的字符不是'A'时,insert和update语句都会非法",MySQL(和PHP搭配之更佳组合)的视图不支持CHECK,我个人是很希望它能支持的。

但如果你很需要在表中使用这样的功能,我建议大家使用触发器来实现。

CREATE TABLE t25(s1 INT, s2 CHAR(5),  Prima(最完善的虚拟主机管理系统)RY KEY (s1))ENGINE=INNODB//CREATE TRIGGER t25_biBEFORE I  NSERT ON t25FOR EACH ROWIF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0; END IF;  CREATE TRIGGER t25_buBEFORE UPDATE ON t25FOR EACH ROWIF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0; END IF;  

我只需要使用BEFORE INSERT和BEFORE UPDATE语句就行了,删除了触发器不会对表有影响,同时AFTER的触发器也不能修改NEW的过程变量(transition variables)。为了激活触发器,我执行了向表中的行插入s1=0的数据,之后只要执行符合LEFT(s2,1) <> 'A'条件的动作都会失败:

INSERT INTO t25 VALUES (0,'a') /* priming the pump */ //INSERT INTO t25 VALUES (5,'b') /* gets error '23000' */ //Don't Believe The Old MySQL(和PHP搭配之更佳组合) Manual该抛弃旧的MySQL(和PHP搭配之更佳组合)的手册了

我在这里警告大家不要相信过去的MySQL(和PHP搭配之更佳组合)手册中

上面说了这么多内容,是关于对MySQL5触发器教程教程的介绍,不知道各位对MySQL的认识是不是更上一层楼了,时时关注2345hao.cn,学习最新Mysql技术。

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://www.2345hao.cn/blog/index.php/post/21167.html

分享给朋友:

“MySQL5触发器的实际操作功能有哪些?” 的相关文章

windows 7系统如何设置休眠时不断网以便继续完成下载

windows 7系统如何设置休眠时不断网以便继续完成下载

在Windows 7系统的默认设置中,当Windows 7系统处于休眠状态时,会同时断网的。如此一来,无论你正在使用迅雷还是快车等下载工具,同样可以在休眠状态下继续完成下载,最大限度做到从身边的小事开始支持环保。下面我们就详细介绍操作步骤,帮助Windows 7系统用户实现这一节能目标。 首先需要...

windows 7查看电脑近期使用情况确定有没有被他人使用

windows 7查看电脑近期使用情况确定有没有被他人使用

我一个朋友最近装装了Windows 7,他总感觉有人用了他的电脑,但是一直不确定,他想知道有没有人动用他的电脑,问我有没有办法 我说设置一下就行了: 启动Windows 7,在搜索栏中输入编辑组,马上就搜索到了编辑组策略,点击即可启动程序编辑组策略。依次展开组策略左侧树形列表的计算机配置/管理模...

Win 7系统中其他声音正常但酷狗音乐没声音怎么回事

Win 7系统中其他声音正常但酷狗音乐没声音怎么回事

故障现象: Windows 7酷狗软件无声音,系统声音正常。 原因分析: 1. 查看酷狗软件设置 2. 查看系统设置 解决方案: 1. Windows 7操作方法 如图:查看是否处于禁音状态   Windows 7系统声音正常酷狗音乐无声音 2. 查看设置音频输出是否...

windows 7系统重装后卡在正在启动Windows开机界面怎么办

windows 7系统重装后卡在正在启动Windows开机界面怎么办

重装系统是我们面对许多电脑问题时的终极方法,不过重装系统也不意味着就能将全部的问题都修复。一些用户在重装系统后开机时,电脑卡在“正在启动Windows”开机界面上了,这要怎么解决呢? Windows 7系统重装后卡在开机界面的解决方法: 一、首先可以看看该故障出现的原因是否是因为启动了acp...

windows 7如何给c盘扩容 图解windows 7 64位系统C盘扩容方法(自

windows 7如何给c盘扩容 图解windows 7 64位系统C盘扩容方法(自

用Windows 7久了,C盘越来越大,原来50G的空间基本用完了,又不想重装系统,就想着能不能直接扩容。 在网上搜了半天,看了无数教程,都写得不明不白的,结合了几篇教程才终于搞明白。 重新总结一下,方便有需要的人。 所用软件: http://www.jb51.net/softs/57895...

windows 7系统怎么取消禁ping命令?

windows 7系统怎么取消禁ping命令?

当我在虚拟机的linux系统中ping本机的ip发现ping不通,而本机可以ping通虚拟机中的ip。应该是出于安全考虑吧,Windows 7默认在防火墙里禁止了。 1、查看主机ip 打开“开始”程序中的“附件”,找到“命令提示符”打开。输入命令:ipconfig,可以看到本机的ip是192.1...