大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 数据库 -> MySQL -> MySQL 5.0 触发器

MySQL 5.0 触发器

时间: 2021-08-13 作者:daque

conventions and styles商定和编制程序作风 历次我想要演练本质代码时,我会对mysql存户端的屏幕就展示的代码举行安排,将字体制改革成courier,使她们看上去与普遍文本不一律(让大师辨别步调代码和正文)。在这边举个例子: mysql> drop function f; query ok, 0 rows affected (0.00 sec) 即使范例比拟大,则须要在某些行和段落间加解释,同声我会用将"<--"标记放在页面包车型的士右边以表白夸大。比方: mysql> create procedure p () -> begin -> /* this procedure does nothing */ <-- -> end;// query ok, 0 rows affected (0.00 sec) 有功夫我会将例子中的"mysql>"和"->"那些体例表露去掉,你不妨径直将代码复制到mysql存户端步调中(即使你此刻所读的不是电子版的,不妨在mysql.com网站载入关系剧本) 以是的例子都仍旧在suse 9.2 linux、mysql 5.0.3大众版上尝试经过。在您观赏该书的功夫,mysql仍旧有更高的本子,同声能扶助更多os了,囊括windows,sparc,hp-ux。所以这边的 例子将能平常的运转在您的电脑上。但即使运转仍旧展示妨碍,不妨接洽你看法的资深mysql用户,如许就能获得比拟好的扶助和扶助。连载请证明翻翻译陈朋奕及转自:www.phpv.net why triggers 干什么要用触发器 咱们在mysql 5.0中包括对触发器的扶助是因为以次因为: mysql早期本子的用户长久有须要触发器的诉求。 咱们已经承诺扶助一切ansi规范的个性。 您不妨运用它来查看或提防坏的数据加入数据库。 您不妨变换大概废除insert, update以及delete语句。 您不妨在一个对话中监督数据变换的举措。 在这边我假设大师都读过"mysql新个性"丛刊的第一集--"mysql保存进程",那么大师都该当领会mysql至此保存进程和因变量,那是很要害的常识,由于在触发器中你不妨运用在因变量中运用的语句。更加举个例子: 复合语句(begin / end)是正当的.连载请证明翻翻译陈朋奕及转自:www.phpv.net 流遏制(flow-of-control)语句(if, case, while, loop, while, repeat, leave,iterate)也是正当的. 变量证明(declare)以及指使(set)是正当的. 承诺前提证明. 特殊处置证明也是承诺的. 然而在这边要记取因变量有受限前提:不许在因变量中考察表.所以在因变量中运用以次语句利害法的。 alter ’cache index’ call commit create delete drop ’flush privileges’ grant insert kill lock optimize repair replace revoke rollback savepoint ’select from table’ ’set system variable’ ’set transaction’ show ’start transaction’ truncate update 在触发器中也有实足一律的控制. 触发器对立而言比拟新,所以会有(bugs)缺点.以是我在这边给大师劝告,就像我在保存进程书中所说那么.不要在含有要害数据的数据库中运用这个触发器,即使须要的话在少许以尝试为手段的数据库上运用,同声在你对表创造触发器时确认那些数据库是默许的。   syntax 语法 1. syntax: name 语法:定名准则连载请证明翻翻译陈朋奕及转自:www.phpv.net create trigger <触发器称呼>               <-- { before | after } { insert | update | delete } on <表称呼> for each row <触发器sql语句> 触发器必需驰名字,最多64个字符,大概反面会附有分割符.它和mysql中其余东西的定名办法基究竟象. 这边我有个风气:即是用表的名字+’_’+触发器典型的缩写.所以即使是表t26,触发器是在事变update(参考底下的点(2)和(3))之前(before)的,那么它的名字即是t26_bu。   2. syntax: time 语法:触发功夫 create trigger <触发器称呼> { before | after } <-- { insert | update | delete } on <表称呼> for each row <触发的sql语句> 触发器有实行的功夫树立:不妨树立为事变爆发前或后。  [page_break]3. syntax: event语法:事变 create trigger <触发器称呼> { before | after } { insert | update | delete } <-- on <表称呼> for each row <触发的sql语句> 同样也能设定触发的事变:它们不妨在实行insert、update或delete的进程中触发。 4. syntax: table 语法:表 create trigger <触发器称呼> { before | after } { insert | update | delete } on <表称呼>                    <-- for each row <触发的sql语句> 触发器是属于某一个表的:当在这个表上实行插入、革新或简略操纵的功夫就引导触发器的激活. 咱们不许给同一张表的同一个事变安置两个触发器。 5. syntax: granularity 语法:( :( 步长)触发间隙 create trigger <触发器称呼> { before | after } { insert | update | delete } on <表称呼> for each row                 <-- <触发的sql语句> 触发器的实行间隙:for each row子句报告触发器每隔一条龙实行一次举措,而不是对所有表实行一次。 6. syntax: statement 语法:语句 create trigger <触发器称呼> { before | after } { insert | update | delete } on <表称呼> for each row <触发的sql语句>                      <-- 触发器包括所要触发的sql语句:这边的语句不妨是任何正当的语句,囊括复合语句,然而这边的语句受的控制和因变量的一律。 privileges权力 你必需具有十分大的权力本领创造触发器(create trigger)。即使你仍旧是root用户,那么就充满了。这跟sql的规范有所各别,我也蓄意能尽量改成规范的。 所以鄙人一个本子的mysql中,你实足有大概看到有一种叫作create trigger的新权力。而后经过如许的本领付与: grant create trigger on <表称呼> to <用户或用户列表>; 也不妨经过如许收回权力: revoke create trigger on <表称呼> from <用户或用户列表>; referring to old and new columns 对于旧的和新创造的列的标识 在触发器的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_au before update on t22 for each row begin set @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的例子 create table with trigger创造有触发器的表 这边一切的例程中我都假设大师的分割符仍旧树立成//(delimiter //)。 create table t22 (s1 integer)// create trigger t22_bi before insert on t22 for each row begin set @x = ’trigger was activated!’; set new.s1 = 55; end;// 在最发端我创造了一个名字为t22的表,而后在表t22上创造了一个触发器t22_bi,当咱们要向表中的行插时髦,触发器就会被激活,执即将s1列的值改为55的举措。 insert on table w ith a trigger运用触发器实行插入举措 mysql> insert into t22 values (1)// 让咱们看即使向表t第22中学插入一条龙数据触发器对应的表会如何样? 这边的插入的举措是很罕见的,咱们不须要触发器的权力来实行它。以至不须要领会能否有触发器关系。 mysql> select @x, t22.* from t22// +------------------------+------+ | @x              | s1   | +------------------------+------+ | trigger was activated! | 55 | +------------------------+------+ 1 row in set (0.00 sec) 大师不妨看到insert举措之后的截止,和咱们预期的一律,x标志被变换了,同声这边插入的数据不是咱们发端输出的插入数据,而是触发器本人的数据。 example of a "check" constraint  "check"完备性牵制例子 what’s a "check" constraint 什么是"check"牵制 在规范的sql谈话中,咱们不妨在(create table)创造表的进程中运用"check (condition)", 比方: create table t25 (s1 int, s2 char(5), primary key (s1), check (left(s2,1)=’a’)) engine=innodb; 这边check的道理是"当s2列的最左边的字符不是’a’时,insert和update语句城市不法",mysql的视图不扶助check,我部分是很蓄意它能扶助的。但即使你很须要在表中运用如许的功效,我倡导大师运用触发器来实行。[page_break]create table t25 (s1 int, s2 char(5), primary key (s1)) engine=innodb// create trigger t25_bi before insert on t25 for each row if left(new.s2,1)<>’a’ then set new.s1=0; end if;// create trigger t25_bu before update on t25 for each row if 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’前提的举措城市波折:连载请证明翻翻译陈朋奕及转自:www.phpv.net insert into t25 values (0,’a’) /* priming the pump */ // insert into t25 values (5,’b’) /* gets error ’23000’ */ // don’t believe the old mysql manual  该唾弃旧的mysql的画册了 我在这边劝告大师不要断定往日的mysql画册中所说的了。咱们仍旧去掉了对于触发器的缺点的语句,然而保持有很多旧本子的画册在网上,举个例子,这是一个德国的url上的: http://dev.mysql.com/doc/mysql/de/ansi_diff_triggers.html. 这个画册上说触发器即是保存进程,忘怀吧,你也仍旧瞥见了,触发器即是触发器,而保存进程仍旧保存进程。 画册上还说触发器不妨从其余表上去简略,大概是当你简略一个工作的功夫激励,不管他说的是什么道理,忘怀吧,mysql不会去实行那些的。连载请证明翻翻译陈朋奕及转自:www.phpv.net 结果对于说运用触发器会对查问速率爆发感化的讲法也是错的,触发器不会对查问爆发任何感化。 bugs (不好的货色就不翻译了) on december 14 2004, i did an "advanced search" in http://bugs.mysql.com for ’trigger’ or ’triggers’, i found that there were 17 active bugs as of that date. of course they might disappear before you read this, but just in case they haven’t, i’ll mention the important ones. if they’re still there, you’ll have to work around them when you’re trying triggers. bug#5859    drop table does not drop triggers. (简略表的功夫没有机动简略触发器) when you drop a table, dropping the table’s triggers should be automatic. bug#5892    triggers have the wrong namespace. (触发器的定名空间有错,你必需在前方加上表的名字本领简略触发器,底下是例子) you have to say "drop trigger <table name> . <trigger name>". the correct way is "drop trigger <trigger name>". bug#5894    triggers with altered tables cause corrupt databases. (触发器对表的变换大概会形成数据库数据被妨害) do not alter a table that has a trigger on it, until you know this is fixed.

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.