??xml version="1.0" encoding="utf-8" standalone="yes"?>一区二区在线视频观看,国产福利在线观看,欧美精品久久http://www.aygfsteel.com/bingle/category/14539.html最大的喜?zhn)Q莫q于技术的q步 Q? 坚定梦想Q毕生追?zh-cnTue, 27 Feb 2007 12:43:57 GMTTue, 27 Feb 2007 12:43:57 GMT60MySQL5触发器教E?/title><link>http://www.aygfsteel.com/bingle/articles/70584.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Tue, 19 Sep 2006 09:30:00 GMT</pubDate><guid>http://www.aygfsteel.com/bingle/articles/70584.html</guid><wfw:comment>http://www.aygfsteel.com/bingle/comments/70584.html</wfw:comment><comments>http://www.aygfsteel.com/bingle/articles/70584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/bingle/comments/commentRss/70584.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/bingle/services/trackbacks/70584.html</trackback:ping><description><![CDATA[ <font size="2">每次我想要演C实际代码时Q我?x)对mysql客户端的屏幕出现的代码q行调整Q将字体Ҏ(gu)CourierQ他们看v来与普通文本不一P让大家区别程序代码和正文Q。在q里举个例子Q?/font> <pre> <font size="2">mysql> DROP FUNCTION f; Query OK, 0 rows affected (0.00 sec)</font> </pre> <font size="2">如果实例比较大,则需要在某些行和D落间加注释Q同时我?x)用?<--"W号攑֜面的右边以表示。例如:(x) </font> <pre> <font size="2">mysql> CREATE PROCEDURE p () -> BEGIN -> /* This procedure does nothing */ <-- -> END;// Query OK, 0 rows affected (0.00 sec) </font> </pre> <font size="2">有时候我?x)将例子中?mysql>"?->"q些pȝ昄LQ你可以直接代码复制到mysql客户端程序中Q如果你现在所ȝ不是?sh)子版的Q可以在mysql.com|站下蝲相关脚本Q?所以的例子都已l在Suse 9.2 Linux、Mysql 5.0.3公共版上试通过。在(zhn)阅L书的时候,Mysql已经有更高的版本Q同时能支持更多OS了,包括WindowsQSparcQHP-UX。因此这里的例子能正常的运行在(zhn)的?sh)脑上。但如果q行仍然出现故障Q可以咨询你认识的资深Mysql用户Q这样就能得到比较好的支持和帮助?br /><br /><strong>Z么要用触发器</strong><br /><br />我们在MySQL 5.0中包含对触发器的支持是由于以下原?</font> <pre> <font size="2">MySQL早期版本的用户长期有需要触发器的要求? 我们曄许诺支持所有ANSI标准的特性? (zhn)可以用它来检查或预防坏的数据q入数据库? (zhn)可以改变或者取消INSERT, UPDATE以及(qing)DELETE语句? (zhn)可以在一个会(x)话中监视数据改变的动作?/font> </pre> <font size="2">在这里我假定大家都读q?MySQL新特?丛书的第一?-"MySQL存储q程"Q那么大安应该知道MySQLx存储q程和函敎ͼ那是很重要的知识Q因为在触发器中你可以用在函数中用的语句。特别D个例子:(x) </font> <pre> <font size="2">复合语句(BEGIN / END)是合法的. 控ӞF(tun)low-of-controlQ语?IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法? 变量声明(DECLARE)以及(qing)指派(SET)是合法的. 允许条g声明. 异常处理声明也是允许? 但是在这里要C函数有受限条?不能在函C讉K? 因此在函C使用以下语句是非法的? 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 在触发器中也有完全一L(fng)限制.</font> </pre> <font size="2">触发器相对而言比较斎ͼ因此?x)有QbugsQ缺?所以我在这里给大家警告Q就像我在存储过E书中所说那?不要在含有重要数据的数据库中使用q个触发器,如果需要的话在一些以试为目的的数据库上使用Q同时在你对表创发器时确认这些数据库是默认的?br /><br /><strong>语法</strong></font> <pre> <font size="2">1. 语法Q命名规? CREATE TRIGGER <触发器名U?gt; <-- { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON <表名U?gt; FOR EACH ROW <触发器SQL语句> </font> </pre> <font size="2">触发器必L名字Q最?4个字W,可能后面?x)附有分隔?它和MySQL中其他对象的命名方式基本相象.<br /><br />q里我有个习(fn)惯:(x)是用表的名字+'_'Q触发器cd的羃?因此如果是表t26Q触发器是在事gUPDATEQ参考下面的点(2Q和Q?Q)之前QBEFOREQ的Q那么它的名字就是t26_bu?</font> <pre> <font size="2">2. 语法Q触发时? CREATE TRIGGER <触发器名U?gt; { BEFORE | AFTER } <-- { INSERT | UPDATE | DELETE } ON <表名U?gt; FOR EACH ROW <触发的SQL语句> 触发器有执行的时间设|:(x)可以讄Z件发生前或后? 3. 语法Q事? CREATE TRIGGER <触发器名U?gt; { BEFORE | AFTER } { INSERT | UPDATE | DELETE } <-- ON <表名U?gt; FOR EACH ROW <触发的SQL语句> 同样也能讑֮触发的事Ӟ(x)它们可以在执行insert、update或delete的过E中触发? 4. 语法Q表 CREATE TRIGGER <触发器名U?gt; { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON <表名U?gt; <-- FOR EACH ROW <触发的SQL语句> 触发器是属于某一个表?当在q个表上执行插入? 更新或删除操作的时候就D触发器的Ȁz? 我们不能l同一张表的同一个事件安排两个触发器? 5. 语法Q( 步长Q触发间? CREATE TRIGGER <触发器名U?gt; { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON <表名U?gt; FOR EACH ROW <-- <触发的SQL语句> 触发器的执行间隔QFOR EACH ROW子句通知触发? 每隔一行执行一ơ动作,而不是对整个表执行一ơ? 6. 语法Q语? CREATE TRIGGER <触发器名U?gt; { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON <表名U?gt; FOR EACH ROW <触发的SQL语句> <-- 触发器包含所要触发的SQL语句Q这里的语句可以是Q何合法的语句Q? 包括复合语句Q但是这里的语句受的限制和函数的一栗? Privileges权限 你必L有相当大的权限才能创发器QCREATE TRIGGERQ? 如果你已l是Root用户Q那么就_了。这跟SQL的标准有所不同? 因此在下一个版本的MySQL中, 你完全有可能看到有一U叫做CREATE TRIGGER的新权限? 然后通过q样的方法赋予:(x) GRANT CREATE TRIGGER ON <表名U?gt; TO <用户或用户列?gt;; 也可以通过q样收回权限Q? REVOKE CREATE TRIGGER ON <表名U?gt; FROM <用户或用户列?gt;; </font> </pre> <font size="2"> <strong>关于旧的和新创徏的列的标?/strong> <br /> <br />在触发器的SQL语句中,你可以关联表中的L列。但你不能仅使用列的名称L识,那会(x)使系l؜淆,因ؓ(f)那里可能?x)有列的新名Q这可能正是你要修改的,你的动作可能正是要修改列名)Q还有列的旧名存在。因此你必须用这L(fng)语法来标识:(x) "NEW . column_name"或?OLD . column_name".q样在技术上处理QNEW | OLD . column_nameQ新和旧的列名属于创Zq渡变量Q?transition variables"Q?<br /><br />对于INSERT语句,只有NEW是合法的Q对于DELETE语句Q只有OLD才合法;而UPDATE语句可以在和NEW以及(qing)OLD同时使用。下面是一个UPDATE中同时用NEW和OLD的例子?/font> <pre> <font size="2">CREATE TRIGGER t21_au BEFORE UPDATE ON t22 FOR EACH ROW BEGIN SET @old = OLD . s1; SET @new = NEW.s1; END;// 现在如果t21表中的s1列的值是55Q那么执行了 "UPDATE t21 SET s1 = s1 + 1"之后@old的g(x)变成55Q? 而@new的值将?x)变?6?/font> </pre> <pre> <font size="2">Example of CREATE and INSERT CREATE和INSERT的例? 创徏有触发器的表 q里所有的例程中我都假定大家的分隔W已l设|成//QDELIMITER //Q? 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;// </font> </pre> <font size="2">在最开始我创徏了一个名字ؓ(f)t22的表Q然后在表t22上创Z一个触发器t22_biQ当我们要向表中的行插入Ӟ触发器就?x)被Ȁz,执行s1列的值改?5的动作?br /><br />使用触发器执行插入动?<br /><br />mysql> INSERT INTO t22 VALUES (1)//<br /><br />让我们看如果向表t2中插入一行数据触发器对应的表?x)怎么P q里的插入的动作是很常见的,我们不需要触发器的权限来执行它。甚至不需要知道是否有触发器关联?/font> <pre> <font size="2">mysql> SELECT @x, t22.* FROM t22// +------------------------+------+ | @x | s1 | +------------------------+------+ | Trigger was activated! | 55 | +------------------------+------+ 1 row in set (0.00 sec) </font> </pre> <font size="2">大家可以看到INSERT动作之后的结果,和我们预期的一Px标记被改动了Q同时这里插入的数据不是我们开始输入的插入数据Q而是触发器自q数据?</font> <pre> <font size="2">"check"完整性约束例? 什么是"check"U束 在标准的SQL语言中,我们可以在(CREATE TABLEQ创的过E中使用"CHECK (condition)"Q? 例如Q? CREATE TABLE t25 (s1 INT, s2 CHAR(5), PRIMARY KEY (s1), CHECK (LEFT(s2,1)='A')) ENGINE=INNODB; </font> </pre> <font size="2">q里CHECK的意思是"当s2列的最左边的字W不?A'Ӟinsert和update语句都会(x)非法"QMySQL的视图不支持CHECKQ我个h是很希望它能支持的。但如果你很需要在表中使用q样的功能,我徏议大家用触发器来实现?/font> <pre> <font size="2">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;// </font> </pre> <font size="2">我只需要用BEFORE INSERT和BEFORE UPDATE语句p了,删除了触发器不会(x)对表有媄响,同时AFTER的触发器也不能修改NEW的过E变量(transition variablesQ。ؓ(f)了激z触发器Q我执行了向表中的行插入s1Q?的数据,之后只要执行W合LEFT(s2,1) <> 'A'条g的动作都?x)失败?x) </font> <pre> <font size="2">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</font> </pre> <font size="2"> <strong>该抛弃旧的MySQL的手册了</strong> <br /> <br />我在q里警告大家不要怿q去的MySQL手册中所说的了。我们已l去掉了关于触发器的错误的语句,但是仍旧有很多旧版本的手册在|上QD个例子,q是一个d国的Url上的Q?http://dev.mysql.com/doc/mysql/de/ANSI_diff_Triggers.html.  q个手册上说触发器就是存储过E,忘掉吧,你也已经看见了,触发器就是触发器Q而存储过E还是存储过E?手册上还说触发器可以从其他表上来删除Q或者是当你删除一个事务的时候激发,无论他说的是什么意思,忘掉吧,MySQL不会(x)d现这些的?最后关于说使用触发器会(x)Ҏ(gu)询速度产生影响的说法也是错的,触发器不?x)对查询产生M影响?<br /></font> <img src ="http://www.aygfsteel.com/bingle/aggbug/70584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/bingle/" target="_blank">冰浪</a> 2006-09-19 17:30 <a href="http://www.aygfsteel.com/bingle/articles/70584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql5存储q程教程http://www.aygfsteel.com/bingle/articles/70582.html冰浪冰浪Tue, 19 Sep 2006 09:25:00 GMThttp://www.aygfsteel.com/bingle/articles/70582.htmlhttp://www.aygfsteel.com/bingle/comments/70582.htmlhttp://www.aygfsteel.com/bingle/articles/70582.html#Feedback0http://www.aygfsteel.com/bingle/comments/commentRss/70582.htmlhttp://www.aygfsteel.com/bingle/services/trackbacks/70582.html阅读全文

冰浪 2006-09-19 17:25 发表评论
]]>
վ֩ģ壺 | ̺| ½| Ϫ| Ϻӿ| ̩| | | ˮ| | | Ǩ| ۽| | ֺ| | ʯȪ| ػ| Ͳ| | ֺ| | | ʡ| | α| | ɽ| «Ϫ| | | | | | | ʯ| | | Ϫ| Ĭ| ƾ|