您当前的位置:站长书库>HTML教程

µز0ւ£º´洢³͐򻍺¯˽

20.2. ´洢³͐򶅓﷨

MySQL 5.1°疧³ִ亯span>´¢³͐򻍺¯˽¡£һ¸�¢³͐󋇿ʒԱ»´洢՚·�еŒ»͗SQLԯ¾䡣һµ©̼±»´洢‹£¬¿ͻ§¶˲»ѨҪՙטт·¢²¼µ¥¶5œ¦£¬¶�Ӕӽԃ´洢³͐󀵌浺¡£

ЂĦһЩȩ¿�洢³͐󔉆唐ԃ£º

·         µ±ԃ²»ͬԯҔ±ᐴ¶ဍ»§Ӧԃ³͐򣬻򷠿ͻ§Ӧԃ³͐󕚲»ͬƽ̨ʏՋѐȒѨҪִѐРͬµŊ�ڗ�±¡£

·         °²ȫ¼«ΪטҪ֮ʱ¡£±Ɉ磬Ӹѐ¶Ջ�ͨ²ڗ�ô洢³͐򡤕㍡¹©һ¸�̶�µĻ·¾³£¬³͐󀊒Ո·±£ÿһ¸��»Ηʆ¼Ȉ쉕־¡£՚֢ҹһ¸�ĖУ¬Ӧԃ³͐򻎓û§²»¿ʄݖ±½ӷĎˊ�µ«ˇ½�Ֆ´ѐָ¶¨µĴ洢³͐𺮳pan>¡£

´亯span>´¢³͐󀊒Ռṩ¸Ł¼º󶅐Մܣ¬ӲΪֻԐ½ЉٵŐƏ¢ѨҪ՚·�Ϳͻ§̣֮¼䴫̍¡£´�ն¼Ԋ��µͳµĸººɣ¬ӲΪ¸�¤ط՚·�ⲟΪ³ɣ¬¸�ڿͻ§¶ˣ¨Ӧԃ³͐򣪄DZࠍ괉ʏ¡£ɧ¹�¿ͻ§¶˻�±Ɉ莸ҳ·�©ֻԉһ¸�ڊ���ṩ·�ʒԿ¼ÇһЂ´洢³͐򡡼/span>

´洢³͐󒳔ː՚˽¾ݿ⸾ϱǷʏԐº¯˽¿⡣֢ˇһ¸�ִ�³͐󔰑Թ²ЭµŌٕ��㒹µńڲ¿ʨ¼ƣ¬±Ɉ荨¹�ࡣʹԃ֢Щ¿ͻ§¶̓¦ԃ³͐󔰑Ռٕ�pan>¶Չ�ۊ�¹ԃ·¶ΧӔ΢µ¼/span>±ഌɋԱ¶¼Ԑºô¦¡£

MySQLΪ´洢³͐󘲑­SQL:2003ԯ·¨£¬֢¸�¨Ҳ±»ԃ՚IBMµÄB2˽¾ݿ㊏¡£

MySQL¶Դ洢³͐򶅊µЖ»¹՚½�¡£̹Ԑ±¾ւѰ˶µœ﷨¶¼±»֧³֣¬՚ԐО׆»󀪕¹µĵط½»⇡µ±µٖ¸³�£Ԑ¹ي¹ԃ ´洢³͐򶅏ߖƵĸ�ܔؼa href="restrictions.html" title="Appendix I. Feature Restrictions">¸½¼ I, ͘єО׆o͡µ½¡£

ɧ20.4½ڣ¬¡°´洢ؓ³͐򻍴¥·¢³͐򶄶�֖¾¹¦Ŝ”o̹˵µģ¬ ´洢ؓ³͐򶄶�֖¾¹¦Ŝӑ¾­Ϊ³ɡ£

20.1. ´洢³͐򻎊ۈ¨±뺯span>

´洢³͐󑩒ª՚mysql˽¾ݿ㗐Ԑproc±֢¸�ٍySQL 5.1°²װ¹�´½¨¡£ɧ¹�էǚµİ汾ʽ¼¶µ½MySQL 5.1 £¬ȫȷ¶¨¸�Ŋۈ¨±ȷ±£proc±´畚¡£ȫ²ϔ¼a href="http://book.chinaz.com/mysql5/installing.html#upgrading-grant-tables" title="2.10.2. Upgrading the Grant Tables">2.10.2½ؠ“ʽ¼¶˚Ȩ±륲dquo;¡£

՚MySQL 5.1א£¬˚ȨϵͳɧЂ¿¼Ç´洢ؓ³͐򣸠

·         ´´½¨´洢ؓ³͐󑩒ªCREATE ROUTINEȨО¡£

·         ͡ё»󓆳�ӳ͐󑩒ªALTER ROUTINEȨО¡£֢¸�ߗԶ¯˚Ԩؓ³͐򶄴´½¨֟¡£

·         ִѐؓ³͐󑩒ªEXECUTEȨО¡£Ȼ¶�¸�ߗԶ¯˚Ԩ ؓ³͐򶄴´½¨֟¡£ͬҹ£¬ؓ³͐󄭈ϵÓQL SECURITY ַ͘ˇDEFINER£¬̼Պѭԃ¸ėӳ͐򸄎ˊ�œû§ԫִѐؓ³͐󁫏µµ½һǰ¡£

20.2. ´洢³͐򶅓﷨

´洢³͐򻍺¯˽ˇԃCREATE PROCEDUREº̃REATE FUNCTIONԯ¾䴴½¨µŗӳ͐򡤒»¸�͐󒫃´ˇһ¸�󒫃´ˇһ¸��ƒALLԯ¾⺯span>4µ� ³͐򣬳͐󖼄ݓĊ䴶±偿´«»ٖµ¡£¾Ώ񲱆匼º¯˽µ�»ҹ£¬º¯˽¿ʒԱ»´ԓ¦΢µ�¨¼´ͨ¹�¯˽Ļ£©£¬º¯˽Ŝ·µ»ر끿ֵ¡£ ´洢ؓ³͐󒲿ʒԵ�匼´洢ؓ³͐򡡠

՚MySQL 5.1א£¬һ¸�¢ؓ³͐򼲺¯˽ԫ͘¶¨µŊ�ၪϵ¡£֢oԐ¼¸¸�¼£º

·         µ±һ¸�͐򱻵�±£¬һ¸�¬µÕSE db_name ±»ִѐ£¨µ±ؓ³͐󗖖¹ʱִֹͣѐ£©¡£´洢ؓ³͐󅚵¼/span>USEԯ¾励²»Պѭµġ£

·         ţ¿ʒՊ¹ԃ˽¾ݿㄻО¶¨ؓ³͐󄻡£֢¿ʒԱ»ԃ4ӽԃһ¸�ڵ±ǰ˽¾ݿ㗐µŗӳ͐򡣱Ɉ磬Ҫӽԃһ¸�est˽¾ݿ⺘jµ¼/span>´洢³͐񰼲º¯˽f£¬ţ¿ʒՋµCALL test.p()»񳤳t.f()¡£

·         ˽¾ݿ㓆³�򣭓쌼¹فªµŋ�´¢ؓ³͐󒲶¼±»ӆ³�:p>

MySQL ֧³ַdz£Ԑԃµŀ©չ£¬¼´̼Պѭ՚´洢³͐󗑊¹ԃ³£¹涄SELECTԯ¾䣨Ň¾Ίȋµ£¬²»ʹԃ¹Ⲫ»늾ֲ¿±偿£©¡£֢¸��¯µĽẻ°�¥µٖ±½ԋ͵½¿ͻ§¶ˡ£¶�LECTԯ¾劺³ɶ๶½ẻ°�Կͻ§¶˱ِ승ԃ֧³ֶྡ¹�MySQL¿ͻ§¶˿⡣֢Ӣζ֢¿ͻ§¶˱ِ鋊ʹԃׁʙMySQL 4.1Ӕ4µĽ�¾ʏµĿͻ§¶˿⡣

ЂĦһ½ۃ鋶ԃ4´´½¨£¬¸ı䣬ӆ³�¯´洢³͐򻍺¯˽µœ﷨¡£

20.2.1CREATE PROCEDUREº˼/span>CREATE FUNCTION

CREATE PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
 
CREATE FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body
    
    proc_parameter:
    [ IN | OUT | INOUT ] param_name type
    
    func_parameter:
    param_name type
 
type:
    Any valid MySQL data type
 
characteristic:
    LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
  | COMMENT 'string'
 
routine_body:
    Valid SQL procedure statement or statements

֢Щԯ¾䴴½¨´洢ؓ³͐򡤒ª՚MySQL 5.1א´´½¨ؓ³͐򣬱ِ뿟ԐCREATE ROUTINEȨО£¬²¢ȒALTER ROUTINEº̅XECUTEȨО±»ؔ¶¯˚Ԩ̼µĴ´½¨֟¡£ɧ¹�׆ɕ־¹¦Ŝ±»Պѭ£¬ţҲ¿ʄݐ钪SUPERȨО£¬ȫ²ϔ¼/span>20.4½ؼ/span>£¬¡°´洢ؓ³͐򻍴¥·¢³͐򶄶�֖¾¹¦Ŝ”¡£

Ĭɏµأ¬ؓ³͐󔫵±ǰ˽¾ݿ⺘j¡£Ҫķȷµذҗӳ͐󔬒»¸�¨˽¾ݿ⺘jǰ4£¬¿ʒՔڴ´½¨ؓ³͐򶅊±º󖸶¨ǤĻؖΪdb_name.sp_name¡£

ɧ¹�ѲĻº΄ڽ¨µ¼/span>SQLº¯˽Ļһҹ£¬¶¨ӥؓ³͐󊱣¬ţѨҪ՚֢¸�ֺ΋滳(ºƖм䳥ɫһ¸�񣬷򕲷¢ʺԯ·¨´¡£µ±ţ̦º󶸓ėӳ͐򶅊±º󒳒ª²扫¡£Ϊ´ˣ¬¼´ʹԐ¿ʄܳ�㗖ȩ¿�Ӄǻ¹ˇ½¨өخºñ݃⹸ţؔ¼ºµ ´洢ؓ³͐󈢓뵦՚µÓQLº¯˽һҹµŃ�

ԉ(ºŰ�ϊ�옜ˇ´畚¡£ɧ¹�²ϊ�Ċ¹ԃһ¸�ϊ�£ÿ¸��϶¼ˇһ¸�ϊ�¸¶¨ΪǤ̼²ϊ�ڲϊ�°ʹԃ¹ؼ�T»񈍏UT

עӢ: ָ¶¨²ϊ� OUT, »񈍏UT ֻ¶ӐROCEDUREˇºϷ¨µġ££¨FUNCTION²ϊ�»ɏΪˇIN²ϊ�:p>

RETURNSؖ¾喻Ŝ¶ӆUNCTIONضָ¶¨£¬¶Ժ¯˽¶�ˇǿ׆µġ£̼ԃ4ָ¶¨º¯˽µķµ»ـᑍ£¬¶�˽ͥ±ِ뱼º¬һ¸�pan>RETURN valueԯ¾䡣

routine_body °�¨µÓQL¹�䡣¿ʒՊ¹ԃ¸´ºГ¦ԯ·¨£¬ȫ²ϔ¼a href="#begin-end" title="20.2.7. BEGIN ... END Compound Statement">20.2.7½ڣ¬¡°BEGIN ... END¸´ºГ¦¡£¸´ºГ¦¿ʒ԰��ѭ»·ºΆ匼¿ٖƽṹԯ¾䡣֢Щԯ¾䶄ԯ·¨՚±¾ւº􄢽ꊜ£¬¾ڀ�ϔ¼a href="#declare" title="20.2.8. DECLARE Statement">20.2.8½ڣ¬¡°DECLAREԯ¾⻳pan>”º˼a href="#flow-control-constructs" title="20.2.12. Flow Control Constructs">20.2.12½ڣ¬¡°·³ٖ̿ƹ¹լ¡±¡£

CREATE FUNCTIONԯ¾䱻ԃ՚¸�ySQL°汾ʏӔ֧³ՕDF £¨ؔ¶¨ӥº¯˽£©¡£ȫ²ϔ¼a href="http://book.chinaz.com/mysql5/extending-mysql.html#adding-functions" title="27.2. Adding New Functions to MySQL">27.2½ڣ¬¡°¸�Lͭ¼Ԑº¯˽”¡£ UDF¼͐�³֣¬¼´ʹЖ՚ Ԑ‹´洢º¯˽¡£UDF»ᱻɏΪһ¸�¿´洢º¯˽¡£Ȼ¶�ҪɃ´洢º¯˽ԫUDFº¯˽¹²ЭĻؖ¿ռ䡣

΢²¿´洢³͐򶄿򽜽«՚²»¾õĽ«4ӽɫ¡£֢½«ՊѭţԃSQL֮΢µœ𐒔±ᐴ´洢³͐򡤗ŜµŊǣ¬µے»¸�§³ד𐒔ˇPHP£¬ӲΪº̐ÐHPӽȦºݐ¡£¬П³̰²ȫ£¬Ȓ¿ʒԱ»·½±㶘Ƕɫ¡£ӲΪ¿򽝊ǹ«¿ªµģ¬̼ϣλѭ¶ᇤ̼ԯҔҲŜ±»֧³֡£

ɧ¹�»󐟳͗݊ǶՍ¬ҹµŊ剫²ϊ�¬ҹµĽẻ£¬ղ±»ɏΪ̼ˇ“ȷ¶¨µ¦rdquo;£¬·򕲾ΊŦldquo;·Ȉ·¶¨”µġ£ɧ¹�Ԑ¸�TERMINISTICҲûԐ¸�T DETERMINISTIC£¬ĬɏµľΊƎOT DETERMINISTIC¡£

Ϊ½�׆£¬ʹԃNOW()º¯˽£¨»󌼵ō¬ӥ´ʣ©»𻲴1:place w:st="on">RAND()º¯˽»᲻±ْªµي¹µĒ»¸�͐򸈈·¶¨¡£¶ӎOW()¶�¶�֖¾°�䵁²¢±»ֽȷ¸´׆¡£RAND() ֻҪ՚һ¸�͐򱼄ۓ¦ԃһ´ϒ²»ᱻֽȷ¸´׆¡££¨ţ¿ʒ԰җӳ͐󖵐ъ±¼䵁º΋漺˽זؓɏΪǿ׆ˤɫ£¬̼ć՚׷´ԉЊȍ¬ҹµġ££©

µ±ǰ4½²£¬DETERMINISTICַ͘±»½Ԋܣ¬µ«»¹ûԐ±»ԅ»¯³͐󌺊¹ԃ¡£Ȼ¶�¶�֖¾¹¦Ŝ±»Պѭ‹£¬֢¸��쵽MySQLˇ·񼡽Ԋݗӳ͐򶩒塣ȫ²ϔ¼a href="#stored-procedure-logging" title="20.4. Binary Logging of Stored Routines and Triggers">20.4½ؼ/span>£¬¡°´洢ؓ³͐򻍴¥·¢³͐򶄶�֖¾¹¦Ŝ”¡£

һЩַ͘͡¹©ؓ³͐󊺓Ċ�۔ېƏ¢¡£CONTAINS SQL±ؓ³͐򲻰�󐵊�¦¡£NO SQL±ؓ³͐򲻰�ԯ¾䡣READS SQL DATA±ؓ³͐򱼺¬¶Š�¦£¬µ«²»°��¦¡£MODIFIES SQL DATA±ؓ³͐򱼺¬д˽¾ݵœ¦¡£ɧ¹�an>֢Щַ͘ûԐķȷ¸�ĬɏµŊƃONTAINS SQL¡£

SQL SECURITYַ͘¿ʒՓĀ´ָ¶¨ ؓ³͐򹄓ô´½¨ؓ³͐󖟵Ő4ִѐ£¬»¹ˇʹԃµ�ߵŐ4ִѐ¡£ĬɏֵˇDEFINER¡£՚SQL:2003א֟ˇһ¸�ِԡ£´´½¨֟»򶸓ĕِ߱씉·Ďȍ ؓ³͐򺙁ªµŊ�Ő¡£՚MySQL 5.1א£¬±ِ씐EXECUTEȨО²Ƅݖ´ѐؓ³͐򡣱ِ쓵Ԑ֢¸�޵œû§Ҫôˇ¶¨ӥ֟£¬Ҫôˇµ�ߣ¬֢ȡ¾�QL SECURITYַ͘ˇɧºω闃µġ£

MySQL´洢sql_modeϵͳ±偿ʨ׃£¬֢¸�Ĕۗӳ͐򱻴´½¨µŊ±º󇱗�¬MySQL؜ˇǿ׆ʹԃ֢¸�Ā´ִѐ ؓ³͐򡡠

COMMENTؓ¾勇һ¸�QLµŀ©չ£¬̼¿ʒԱ»ԃ4Ĩ˶ ´洢³͐򡤕⹶хϢ±»SHOW CREATE PROCEDUREºˠSHOW CREATE FUNCTIONԯ¾倴Дʾ¡£

MySQLՊѭؓ³͐򱼺¬DDLԯ¾䣬ɧCREATEº̄ROP¡£MySQLҲՊѭ´洢³͐򣨵«²»ˇ ´洢º¯˽£©°� ½»»¥ԯ¾䣬ɧCOMMIT¡£´洢º¯˽²»¿ʒ԰�©ضķȷµĺ;�͡½»»󖠗��SQL±뗼²»Ҫȳ¶Օ㐩ԯ¾䶄֧³֣¬SQL±뗼ʹķÿ¸�S͡¹©ʌ¿ʒԾ�Ƿ򕋐³ו㐩ԯ¾䡣

´洢ؓ³͐򲼄݊¹ԃLOAD DATA INFILE¡£

·µ»ؽẻ°�䲻Ŝ±»ԃ՚´洢º¯˽ז¡£֢°�¹ԃINTO¸�¶ˆ¡ ֵµÓELECTԯ¾䣬SHOW ԯ¾䣬¼°Ǥ̼׮ɧEXPLAIN֢ҹµœ¦¡£¶Փڿʔں¯˽¶¨ӥʱ¼䱻¾�ª·µ»ْ»¸��ԯ¾䣬·¢ʺһ¸�º¯˽´·µ»ؽẻ°�£¨ER_SP_NO_RETSET_IN_FUNC£©¡£¶Փۖ»¿ʔ۔̐ъ±¾�ª·µ»ْ»¸��ԯ¾䣬 ·¢ʺһ¸�ݔڸ�Ђτ´·µ»ؽẻ°�CEDURE %s £¨ER_SP_BADSELECT)¡£

ЂĦˇһ¸�UT²ϊ�¥µĴ洢³͐򶅀��¬՚ ³͐򱻶¨ӥµŊ±º򣭓|strong>mysql¿ͻ§¶ʤelimiterļ®4°ғ¦¶¨½縻´Ѡ;±厪//¡£֢¾Δː՚ ³͐󍦖е»¶¨½縻±»´«µݵ½·��±»mysqlؔ¼º4½㋍¡£

mysql> delimiter //
 
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
    -> BEGIN
    ->   SELECT COUNT(*) INTO param1 FROM t;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter ;
 
mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT @a;
+------+
| @a   |
+------+
| 3    |
+------+
1 row in set (0.00 sec)

µ±ʹԃdelimiterļ®ʱ£¬ţӦ¸ñ݃㊹ԃ·´б¸ڨ\)ؖ·�ΪҡMySQLµ תӥؖ·�o:p>

Ђˇһ¸�ӣ¬һ¸�òϊ��»¸�º¯˽ִѐһ¸��¢·µ»ؽẻ£º

mysql> delimiter //
 
mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
    -> RETURN CONCAT('Hello, ',s,'!');
    -> //
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter ;
 
mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)

ɧ¹�´¢º¯˽אµÒETURNԯ¾䷵»ْ»¸�Ͳ»ͬԚ՚º¯˽µ¼/span>RETURNSؓ¾嗐ָ¶¨`эµŖµ£¬·µ»ٖµ±»ǿ׆Ϊǡµ±µŀᑍ¡£±Ɉ磬ɧ¹�º¯˽·µ»ْ»¸�M»񒄔ֵ£¬µ«ˇRETURNԯ¾䷵»ْ»¸��ٓET³ʔ±¼¯µŏᓦµÅNUM³ʔ±£¬´Ӻ¯˽·µ»صŖµˇؖ·�

20.2.2. ALTER PROCEDUREº˼/span>ALTER FUNCTION

ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
 
characteristic:
    { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
  | COMMENT 'string'

֢¸�倉Ӕ±»ԃ4¸ı咻¸�¢³͐򼲺¯˽µŌٕ�ٍySQL 5.1א£¬ţ±ِ씃ALTER ROUTINEȨО²ſʓô̗ӳ͐򡤕⹶ȨО±»ؔ¶¯˚Ԩؓ³͐򶄴´½¨֟¡£ɧ20.4½ڣ¬¡°´洢ؓ³͐򻍴¥·¢³͐򶄶�֖¾¹¦Ŝ”א̹˶£¬ ɧ¹�׆ɕ־¹¦Ŝ±»Պѭ‹£¬ţ¿ʄݒ²ѨҪSUPERȨО¡£

՚ALTER PROCEDUREº́LTER FUNCTIONԯ¾嗐£¬¿ʒՖ¸¶¨³¬¹�ĸı䡣

20.2.3. DROP PROCEDUREº˼span>DROP FUNCTION

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

֢¸�䱻ԃ4ӆ³�洢³͐򼲺¯˽¡£¼´£¬´ӷ�Ƴ�ƶ¨µŗӳ͐򡤔ٍySQL 5.1א£¬ţ±ِ씐ALTER ROUTINEȨО²ſʓô̗ӳ͐򡤕⹶ȨО±»ؔ¶¯˚Ԩؓ³͐򶄴´½¨֟¡£

IF EXISTS ؓ¾勇һ¸�QLµŀ©չ¡£ɧ¹�»򺰊�¢£¬̼·V¹·¢ʺ´¡£²�¸�Փ“HOW WARNINGS²鿴µľ¯¸档

20.2.4. SHOW CREATE PROCEDUREº˼/span>SHOW CREATE FUNCTION

SHOW CREATE {PROCEDURE | FUNCTION} sp_name

֢¸�勇һ¸�QLµŀ©չ¡£`̆ԚSHOW CREATE TABLE£¬̼·µ»ْ»¸�Ā´טт´´½¨ӑļĻ ؓ³͐򶅈·Ȑؖ·�

mysql> SHOW CREATE FUNCTION test.hello\G
*************************** 1. row ***************************
       Function: hello
       sql_mode:
Create Function: CREATE FUNCTION `test`.`hello`(s CHAR(20)) RETURNS CHAR(50)
RETURN CONCAT('Hello, ',s,'!')

20.2.5. SHOW PROCEDURE STATUSº˼/span>SHOW FUNCTION STATUS

SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']

֢¸�勇һ¸�QLµŀ©չ¡£̼·µ»ٗӳ͐򶅌ٕ�苽¾ݿ⣬Ļؖ£¬`э£¬´´½¨֟¼°´´½¨ºΐ޸ňֆڡ£ɧ¹�ָ¶¨ҹʽ£¬¸�ʹԃµœ¦£¬̹Ԑ ´洢³͐򻎋�´¢º¯˽µŐƏ¢¶¼±»³�o:p>

mysql> SHOW FUNCTION STATUS LIKE 'hello'\G
*************************** 1. row ***************************
           Db: test
         Name: hello
         Type: FUNCTION
      Definer: testuser@localhost
     Modified: 2004-08-03 15:29:37
      Created: 2004-08-03 15:29:37
Security_type: DEFINER
      Comment:

ţ¿ʒԴ҉NFORMATION_SCHEMAאµÒOUTINES±µēйش洢ؓ³͐򶅐Ə¢¡£ȫ²ϔ¼a href="http://book.chinaz.com/mysql5/information-schema.html#routines-table" title="23.1.14. The INFORMATION_SCHEMA ROUTINES Table">23.1.14½ڣ¬¡°INFORMATION_SCHEMA ROUTINES ±뻳pan>”¡£

20.2.6. CALLԯ¾⺯span>

CALL sp_name([parameter[,...]])

CALLԯ¾䶷ԃһ¸�°ԃCREATE PROCEDURE´´½¨µij͐򡡠

CALLԯ¾⺯span>¿ʒՓM ʹķΪOUT»򶃉NOUT²ϊ��ĵ�ߴ«»ٖµ¡£̼Ҳ“·µ»֦rdquo;˜ӰЬµŐъ�§¶˳͐󀊒Քؼ/span>SQL¼¶±񍨹�span>ROW_COUNT()º¯˽»񶄕⹶˽£¬´҃אˇµ�he mysql_affected_rows() C APIº¯˽4»񶃡£

20.2.7. BEGIN ... END¸´ºͼ/span>ԯ¾⺯span>

[begin_label:] BEGIN
    [statement_list]
END [end_label]

´洢ؓ³͐󀊒Պ¹ԃBEGIN ... END¸´ºГ¦4°��䡣statement_list ´�¸�๶ԯ¾䶄±statement_list֮Śÿ¸�䶼±ِ씃·ֺţ¨£»£©4½⎲¡£

¸´ºГ¦¿ʒԱ»±꽇¡£³�begin_label´畚,·򕰼i>end_label²»Ŝ±»¸�¢Ȓɧ¹�¶¼´畚,̻ć±ِ싇ͬҹµġ£

ȫעӢ£¬¿ʑ¡µÛNOT] ATOMICؓ¾吖՚»¹²»±»֧³֡£֢Ӣζ؅՚ָ®¿鶄¿ªʼûԐ½»»¥µĴ洢µ㱻ʨ׃£¬²¢Ȓ՚ʏЂτאԃµ½µÂEGINؓ¾䷔µ±ǰ½»»¥¶¯طûԐӰЬ¡£

ʹԃ¶ᗘԯ¾周Ҫ¿ͻ§¶ܷ̄¢̍°�䶨½縻;µIJꑯؖ·�֢¸�Ɣۃ�ͻ§¶˱»ԃdelimiterļ®4´¦m¡£¸ı䳩ѯ½⎲¶¨½縻;£¨±Ɉ繄±厪//£©ʹµ{ ¿ɱ»ԃ՚ؓ³͐󍦖С£

20.2.8. DECLAREԯ¾⺯span>

DECLAREԯ¾䱻ԃ4°Ѳ»ͬЮĿ¾ד򵾒»¸􋋗ӳ͐򣺾ֲ¿±偿£¨ȫ²ϔ¼a href="#variables-in-stored-procedures" title="20.2.9. Variables in Stored Procedures">20.2.9½ڣ¬¡°´洢³͐󗐵ı偿”)£¬͵¼�¦m³͐򣩇볎Մ20.2.10½ڣ¬¡°͵¼�Ѳ”) ¼°¹Ⲫ£¨ȫ²ϔ¼a href="#cursors" title="20.2.11. Cursors">20.2.11½ڣ¬¡°¹Ⲫ”)¡£SIGNALº̒ESIGNALԯ¾䵱ǰ»¹²»±»֧³֡£

DECLARE½�ĔقEGIN ... END¸´ºГ¦o£¬²¢Ȓ±ِ앚¸´ºГ¦µĿªͷ£¬՚Ɏºφ匼ԯ¾單ǰ¡£

¹Ⲫ±ِ앚ʹķ´¦m³͐󖯇°±»ʹķ£¬²¢Ȓ±偿ºΌ�ِ앚ʹķ¹Ⲫ»򴧀Ѳ֮ǰ±»ʹķ¡£

20.2.9. ´洢³͐󗐵ı偿

ţ¿ʒՔۗӳ͐󗑉�ʹԃ±偿¡£

20.2.9.1. DECLARE¾ֲ¿±偿

DECLARE var_name[,...] type [DEFAULT value]

֢¸�䱻ԃ4ʹķ¾ֲ¿±偿¡£Ҫ¸�͡¹©һ¸�Жµ£¬ȫ°��AULTؓ¾䡣ֵ¿ʒԱ»ָ¶¨Ϊһ¸�𐊽£¬²»ѨҪΪһ¸���DEFAULTؓ¾䣬³�µΪNULL¡£

¾ֲ¿±偿µŗ�¶Χ՚̼±»ʹķµÂEGIN ... END¿ꅚ¡£̼¿ʒԱ»ԃ՚Ƕ͗µĿꗐ£¬³�©ԃРͬĻؖ ʹķ±偿µĿ顣

20.2.9.2. ±偿SETԯ¾⻯:p>

SET var_name = expr [, var_name = expr] ...

՚´洢³͐󗐵ÓETԯ¾勇һ°⒅Tԯ¾䶄)չ°汾¡£±»²ο¼±偿¿ʄ݊ȗӳ͐󅛉�±偿£¬»󖠊Ȉ«¾ַ�偿¡£

՚´洢³͐󗐵ÓETԯ¾嘷ΪԤЈ´畚µÓETԯ·¨µŒ»²¿·׀´ʵЖ¡£֢ՊѭSET a=x, b=y, ...֢ҹµŀ©չԯ·¨¡£Ǥא²»ͬµı偿`э£¨¾ד닉�¼°ȫ¾ֺͼ¯ͥ±偿£©¿ʒԱ»»컏ǰ4¡£֢ҲՊѭ°Ѿֲ¿±偿ºΒ»Щֻ¶Տµͳ±偿ԐӢӥµő¡Юºϲ¢ǰ4¡£՚Ňזȩ¿�¬´̑¡Ю±»ʶ±𣬵«ˇ±»º�ˡ£

20.2.9.3. SELECT ... INTOԯ¾⻯:p>

SELECT col_name[,...] INTO var_name[,...] table_expr

֢¸�ECTԯ·¨°ґ¡¶¨µŁі±½Ӵ洢µ½±偿¡£Ӳ´ˣ¬ֻԐµ¥һµŐпʒԱ»ȡ»ء£

SELECT id,data INTO x,y FROM test.t1 LIMIT 1;

עӢ£¬ԃ»§±偿Ļ՚MySQL 5.1אˇ¶Դ�´²»Ĵ¸еġ£ȫ²ϔ¼a href="http://book.chinaz.com/mysql5/language-structure.html#variables" title="9.3. User Variables">9.3½ڣ¬¡°ԃ»§±偿”¡£

טҪ: SQL±偿ϲ»Ŝº΁у�¡£ɧ¹�CT ... INTO֢ҹµÓQLԯ¾䱼º¬һ¸�еIJο¼£¬²¢°��я፬Ļؖµ ¾ֲ¿±偿£¬MySQLµ±ǰ°Ѳο¼½㋍Ϊһ¸�¿µŃ�}ɧ£¬՚ЂĦµœ¦א£¬xname ±»½㋍Ϊµ½xname variable µIJο¼¶�µ½xname columnµģº

CREATE PROCEDURE sp1 (x VARCHAR(5))
  BEGIN
    DECLARE xname VARCHAR(5) DEFAULT 'bob';
    DECLARE newname VARCHAR(5);
    DECLARE xid INT;
    
    SELECT xname,id INTO newname,xid 
      FROM table1 WHERE xname = xname;
    SELECT newname;
  END;

µ±֢¸�򱻵�Ŋ±º򣭎߂ڴable.xnameµŖµˇʲô£¬±偿newname½«·µ»ٖµ‘bob’¡£

ȫ²ϔ¼a href="http://book.chinaz.com/mysql5/restrictions.html#routine-restrictions" title="I.1. Restrictions on Stored Routines and Triggers">I.1½ڣ¬¡°´洢ؓ³͐򻍴¥·¢³͐򶅏ߖĦrdquo;¡£

20.2.10. ͵¼�Ѳ

͘¶¨͵¼�ض¨´¦m¡£֢Щ͵¼�ªϵµ½´£¬Ӕ¼°ؓ³͐󗐵Œ»°䂷³ٖ̿ơ£

20.2.10.1. DECLARE͵¼�n>

DECLARE condition_name CONDITION FOR condition_value
 
condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | mysql_error_code

֢¸�喸¶¨ѨҪ͘ˢ´¦mµŌ�£̼½«һ¸�ֺΖ¸¶¨µĴ͵¼�񀴡£֢¸�ֿʒՋ滳±»ԃ՚DECLARE HANDLERԯ¾嗐¡£ȫ²ϔ¼a href="#declare-handlers" title="20.2.10.2. DECLARE Handlers">20.2.10.2½ڣ¬¡°DECLARE´¦m³͐𻲰an>”¡£

³�STATEֵ£¬Ҳ֧³ՍySQL´´�

20.2.10.2. DECLARE´¦m³͐𺮳pan>

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
 
handler_type:
    CONTINUE
  | EXIT
  | UNDO
 
condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
  | mysql_error_code

֢¸�喸¶¨ÿ¸�Դ¦mһ¸�๶͵¼�Ѳ¡£ɧ¹�һ¸�๶͵¼�¨µœ¦±»ִѐ¡£

¶Ւ»¸�TINUE´¦m³͐򣬵±ǰؓ³͐򶅖´ѐ՚ִѐ ´¦m³͐󔯾單º󽍐�ԚEXIT´¦m³͐򣬵±ǰBEGIN...END¸´ºГ¦µŖ´ѐ±»וֹ¡£UNDO ´¦m³͐󁡐Γ¦»¹²»±»֧³֡£

·         SQLWARNINGˇ¶Ջ�01¿ªͷµÓQLSTATE´�̙¼ǡ£

·         NOT FOUNDˇ¶Ջ�02¿ªͷµÓQLSTATE´�̙¼ǡ£

·         SQLEXCEPTIONˇ¶Ջ�Ԑ±»SQLWARNING»񍎔 FOUND²¶»񶃓QLSTATE´�̙¼ǡ£

³�STATEֵ£¬MySQL´´�²»±»֧³֡£

}ɧ:

mysql> CREATE TABLE test.t (s1 int,primary key (s1));
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter //
 
mysql> CREATE PROCEDURE handlerdemo ()
    -> BEGIN
    ->   DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
    ->   SET @x = 1;
    ->   INSERT INTO test.t VALUES (1);
    ->   SET @x = 2;
    ->   INSERT INTO test.t VALUES (1);
    ->   SET @x = 3;
    -> END;
    -> //
Query OK, 0 rows affected (0.00 sec)
 
mysql> CALL handlerdemo()//
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT @x//
    +------+
    | @x   |
    +------+
    | 3    |
    +------+
    1 row in set (0.00 sec)

עӢµ½£¬@xˇ3£¬֢±MySQL±»ִѐµ½³͐򶅄©β¡£ɧ¹�ARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; ֢һѐ²»՚£¬µڶ�ERTӲPRIMARY KEYǿ׆¶�֮º񫌹SQL¿ʄݒѾ­²ʈ¡ Ĭɏ(EXIT)·¾¶£¬²¢ȒSELECT @x¿ʄݒѾ­·µ»ֲ¡£

20.2.11. ¹Ⲫ

¼򵥹Ⲫ՚´洢³͐򻍺¯˽ڱ»֧³֡£ԯ·¨ɧͬ՚ǶɫµÓQLא¡£¹Ⲫµ±ǰˇ²»Ĵ¸еģ¬ֻ¶uļ°²»¹�ġ£²»Ĵ¸ђ㎪·�ʒԻ¿ʒԸ´׆̼µĽẻ±

¹Ⲫ±ِ앚ʹķ´¦m³͐󖯇°±»ʹķ£¬²¢Ȓ±偿ºΌ�ِ앚ʹķ¹Ⲫ»򴧀Ѳ֮ǰ±»ʹķ¡£

}ɧ£º

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a CHAR(16);
  DECLARE b,c INT;
  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
 
  OPEN cur1;
  OPEN cur2;
 
  REPEAT
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF NOT done THEN
       IF b < c THEN
          INSERT INTO test.t3 VALUES (a,b);
       ELSE
          INSERT INTO test.t3 VALUES (a,c);
       END IF;
    END IF;
  UNTIL done END REPEAT;
 
  CLOSE cur1;
  CLOSE cur2;
END

20.2.11.1.ʹķ¹Ⲫ

DECLARE cursor_name CURSOR FOR select_statement

֢¸�効ķһ¸�ꡣҲ¿ʒՔۗӳ͐󗐶¨ӥ¶๶¹Ⲫ£¬µ«ˇһ¸�еŃ¿һ¸�겘ѫԐΨһµŃ�

SELECTԯ¾䲻ŜԐINTOؓ¾䡣

20.2.11.2. ¹ⲪOPENԯ¾⺯span>

OPEN cursor_name

֢¸�䵲¿ªЈǰʹķµĹⲪ¡£

20.2.11.3. ¹ⲪFETCHԯ¾⺯span>

FETCH cursor_name INTO var_name [, var_name] ...

֢¸�唃ָ¶¨µĴ򿪹Ⲫ¶ˆ¡Ђһѐ£¨ɧ¹�һѐµĻ°£©£¬²¢Ȓǰ½�ָ֫¡£

20.2.11.4. ¹ⲪCLOSEԯ¾⺯span>

CLOSE cursor_name

֢¸�亘±֏ɇ°´򿪵ĹⲪ¡£

ɧ¹�ķȷµعرգ¬¹Ⲫ՚̼±»ʹķµĸ´ºГ¦µń©β±»¹رա£

20.2.12. ·³ٖ̿ƹ¹լ

IF, CASE, LOOP, WHILE, ITERATE, ¼° LEAVE ¹¹լ±»ΪȫʵЖ¡£

֢Щ¹¹լ¿ʄ݃¿¸�¬Ҫôһ¸�S¦£¬ҪôˇʹԃBEGIN ... END¸´ºГ¦µŒ»¿ꔯ¾䡣¹¹լ¿ʒԱ»Ƕ͗¡£

Ŀǰ»¹²»֧³ՆORѭ»·¡£

20.2.12.1. IFԯ¾⺯span>

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

IFʵЖ‹һ¸�¾µŌ�¹լ¡£ɧ¹�earch_conditionȳֵΪ֦£¬РӦµÓQLԯ¾傐±ִѐ¡£ɧ¹�search_conditionƥƤ£¬՚ELSEؓ¾偯µœ¦±ִѐ¡£statement_list¿ʒ԰��๶ԯ¾䡣

ȫעӢ£¬ҲԐһ¸�) º¯˽£¬̼²»ͬԚ֢oĨ˶µÉFԯ¾䡣ȫ²ϔ¼a href="http://book.chinaz.com/mysql5/functions.html#control-flow-functions" title="12.2. Control Flow Functions">12.2½ڣ¬¡°¿ٖǁ�¯˽”¡£

20.2.12.2. CASEԯ¾⺯span>

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

Or:

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

´洢³͐򶃃ASEԯ¾劵Жһ¸�ӵŌ�¹լ¡£ɧ¹�earch_condition ȳֵΪ֦£¬РӦµÓQL±»ִѐ¡£ɧ¹�̷̑͵¼�¬՚ELSEؓ¾偯µœ¦±»ִѐ¡£

עӢ£º֢o½ꊜµœĔ؍ ´洢³͐󁯵ÃASEԯ¾唫12.2½ڣ¬¡°¿ٖǁ�¯˽¡±oĨ˶µÓQL CASE±ʽµÃASEԯ¾唐ȡ΢²»ͬ¡£֢oµÃASEԯ¾䲻ŜԐELSE NULLؓ¾䣬²¢ȒԃEND CASEͦ´�´וֹ¡£

20.2.12.3. LOOPԯ¾⺯span>

[begin_label:] LOOP
    statement_list
END LOOP [end_label]

LOOPՊѭij͘¶¨ԯ¾伲ԯ¾刺µŖظ´ִѐ£¬ʵЖһ¸�¥µő­»·¹¹լ¡£՚ѭ»·Śµœ¦һֱט¸´ֱѭ»·±»΋³�˳�£°ꌦ؅һ¸�pan>LEAVE ԯ¾䡣

LOOPԯ¾倉Ӕ±»±뗢¡£³�begin_label´畚£¬·򕰼i>end_label²»Ŝ±»¸�²¢Ȓɧ¹�¶¼³�¬̼ć±ِ싇ͬҹµġ£

20.2.12.4. LEAVEԯ¾⺯span>

LEAVE label

֢¸�䱻ԃ4΋³�α»±뗢µŁ�ٖƹ¹լ¡£̼º̂EGIN ... END»󑭻·һǰ±»ʹԃ¡£

20.2.12.5. ITERATEԯ¾⻯:p>

ITERATE label

ITERATEֻ¿ʒԳ�ٌOOP, REPEAT, º̗HILEԯ¾党¡£ITERATEӢ˼Ϊ£º“ՙ´ϑ­»·¡£”

}ɧ£º

CREATE PROCEDURE doiterate(p1 INT)
BEGIN
  label1: LOOP
    SET p1 = p1 + 1;
    IF p1 < 10 THEN ITERATE label1; END IF;
    LEAVE label1;
  END LOOP label1;
  SET @x = p1;
END

20.2.12.6. REPEATԯ¾⺯span>

[begin_label:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [end_label]

REPEATԯ¾党µœ¦»󔯾刺±»ט¸´£¬ֱׁsearch_condition Ϊ֦¡£

REPEAT ԯ¾倉Ӕ±»±뗢¡£ ³�begin_labelҲ´畚£¬end_label²Ƅܱ»ԃ£¬ɧ¹�¶¼´畚£¬̼ć±ِ싇һҹµġ£

£º

mysql> delimiter //
 
mysql> CREATE PROCEDURE dorepeat(p1 INT)
    -> BEGIN
    ->   SET @x = 0;
    ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)
 
mysql> CALL dorepeat(1000)//
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT @x//
+------+
| @x   |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)

20.2.12.7. WHILEԯ¾⺯span>

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]

WHILEԯ¾党µœ¦»󔯾刺±»ט¸´£¬ֱׁsearch_condition Ϊ֦¡£

WHILEԯ¾倉Ӕ±»±뗢¡£ ³�begin_labelҲ´畚£¬end_label²Ƅܱ»ԃ£¬ɧ¹�¶¼´畚£¬̼ć±ِ싇һҹµġ£

}ɧ£º

CREATE PROCEDURE dowhile()
BEGIN
  DECLARE v1 INT DEFAULT 5;
 
  WHILE v1 > 0 DO
    ...
    SET v1 = v1 - 1;
  END WHILE;
END

20.3. ´洢³͐늡¢º¯˽¡¢´¥·¢³͐򼰸´׆£º³£¼�

  • MySQL 5.1´洢³͐򻍺¯˽¶Ը´׆ǰطԃ𣿠

    ˇµģ¬՚´洢³͐򻍺¯˽א±»ִѐ±뗼ѐΪ±»´Ԗ�QL·�´׆µ½´ӷ�£Ԑʙ˽О׆£¬̼ć՚20.4½ڣ¬¡°´洢ؓ³͐򻋍 ´¥·¢³͐򷾽�־¹¦Ŝ¡±אЪ˶¡£

  • ՚׷·�ϴ´½¨µĴ洢³͐򻍺¯˽¿ʒԱ»¸´׆µ½´ӷ�Ѓ´£¿

    ˇµģ¬ͨ¹�DLԯ¾喴ѐµĴ洢³͐򻍺¯˽£¬Ǥ՚׷·�ϵĴ´½¨±»¸´׆µ½´ӷ�¬̹ӔĿ±꽫´畚}¸�򇸉ϡ£¶Դ洢³͐򻍺¯˽µÁLTER º̄ROPԯ¾咲±»¸´׆¡£

  • ѐΪɧºϔےѸ´׆µĴ洢³͐򻍺¯˽o·¢ʺ£¿

    MySQL¼΂¼ÿ¸��´¢³͐򻍺¯˽oµÄML˂¼�´׆֢Щµ¥¶5Őюªµ½´ӷ�£ִѐ´洢³͐򻍺¯˽µŇъµµ�»±»¸´׆¡£

  • ¶Ւ»ǰʹԃ´洢³͐򣬺¯˽º͸´׆Ԑʲô͘±𶄰²ȫҪȳô£¿

    ˇµģ¬ӲΪһ¸��ш¨О4ִѐɎºζ—Ֆ�򇷵Ķ�֖¾µœ¦£¬ָ¶¨µİ²ȫԼ˸Ӳԫ¸´׆һǰʹԃµĴ洢³͐򻍺¯˽¶�¡£ɧ¹�»򷾽�־´􍦉ЊǼ¤»£¨Ϊpoint-in-time»ָ´µń¿µģ©£¬ŇôMySQL DBA Ԑ}¸�«ѡЮ¿ʑ¡£º

    • ɎºϏ봴½¨´洢³͐򶅓û§±ِ뱻¸³ԨSUPERȨО¡£
    • طΪѡձ£¬һ¸�¿ʒՉ闃log_bin_trust_routine_creatorsϵͳ±偿Ϊ1£¬̼½«»╊ѭԐ±뗼CREATE ROUTINEȨОµň̀´´´½¨һ¸�¢³͐򻍺¯˽¡£
     
  • ¶Ը´׆´洢³͐򻍺¯˽µŐюªԐʲôО׆£¿

    Ƕɫµ½´洢³͐󗐵IJ»ȷ¶¨£¨̦»�ʱ»�Ŝˊµ±µظ´׆¡£̦»�µĽẻ£¬½�䱾є£¬ˇţ¿ʔ¤²ⶄºͲ»Ŝ±»ȷʵ¿̂¡µġ£Ӳ´ˣ¬¸´׆µ½´ӷ�ŋ漺ѐΪ½«²»»᾵бŇЩ²�׷·�ϵġ£עӢ£¬ ʹķ´洢³͐򼲺¯˽ΪDETERMINISTIC»󖠔٬og_bin_trust_routine_creatorsאʨ׃ϵͳ±偿Ϊ0 ½«»╊ѭ̦¼´ֵ²ڗ��£

    ´̍⣬ʱ»�²»Ŝ՚´ӷ�Жِ²�ӲΪ՚´洢³͐󗑍¨¹�NJ¹ԃµĶ�֖¾4¼NJ±֢ҹµŊ±»�ˇ²»¿ʖِ²�£¬ӲΪ¸ö�֖¾½�¼DML˂¼��±Լ˸¡£

    خº󣭔ڴ�MLѐΪ£¨ɧ´􆺲扫£©א·ǽ»»¥±ʺ´£¬¸÷ǽ»»¥±Ŝ¾­z¸´׆£¬՚¸´׆°涄·ǽ»»¥±׷·�ʒԱ»²¿·ֵش҄MLѐΪ¸�«ˇӲΪ·¢ʺµńǸ�󣬶Դӷ�»Ԑ¸� ¶Ժ¯˽µÄMLѐΪ£¬¹¤طȸ½«±»ԃIGNORE¹ؼ�´ѐ£¬Ӕ±䔚՚׷·�ϵ¼ׂ´µĸ��¬²¢Ȓ²»»ᵼׂ´µĸ�´׆µ½´ӷ�£

     

  • ʏ˶µŏߖƻ⓰ЬMySQLط point-in-time»ָ´µń݁¦ð£¿

    ӰЬ¸´׆µō¬һО׆»⓰Ьpoint-in-time»ָ´¡£

  •  MySQLҪضʲô4¸ŕ�ŏߖDŽأ¿

    ½«4·¢ѐµÍySQLԤǚԐһ¸�݈¥ѡձ¸´׆¸Ĉ绎±»´¦m£º

    •  »�¾䶄¸´׆£¨µ±ǰʵЖ£©¡£
    • ѐ¼¶±𸵖ƣ¨̼½«½⿶̹ԐէЈĨ˶µŏߖƣ©¡£
  • ´¥·¢³͐򷔸´׆ǰطԃô£¿

    MySQL 5.1אµĴ¥·¢³͐򻍸´׆г՚´󷡊���»ҹ¹¤ط£¬՚ŇЩӽȦא£¬ͨ¹�͐󕛖�򇸉Ж´ѐµŐюª²»±»¸´׆µ½´ӷ�£ȡ¶�µŊǣ¬λԚ׷MySQL·�ıµ ´¥·¢³͐󑩒ª՚ŇЩ´畚ԚɎº͍ySQL´ӷ�ϵı±»´´½¨£¬Ӕ±䔚´¥·¢³͐󀊒Ւ²¿ʒՔڴӷ�ϱ»¼¤»

     

  •  һ¸�ªɧºύ¨¹��ϸ´׆µ½´ӷ�ϵĴ¥·¢³͐󀵖´ѐŘ£¿

    ˗Ј£¬׷·�ϵĴ¥·¢³͐򲙐앚´ӷ�Жؽ¨¡£һµ©ט½¨‹£¬¸´׆·³̾Ώ􇥋�½¸´׆אµı뗼DMLԯ¾咻ҹ¹¤ط¡£}ɧ£º¿¼Çһ¸�­²扫´¥·¢³͐񀅔ERµÅMP±̼λԚ׷MySQL·�ϡ£ͬҹµÅMP±AFTER²扫 ´¥·¢³͐󒲴畚Ԛ´ӷ�ϡ£¸´׆·³̿ʄ݊ǣº

1.    ¶ӅMPضһ¸�ERTԯ¾䡣

2.   EMPʏµÁFTER´¥·¢³͐򼤻

3.    INSERTԯ¾䱻д½�׆ɕ־¡£

4.    ´ӷ�ϵĸ´׆ʰǰINSERTԯ¾乸EMP±²¢՚´ӷ�Ж´ѐ̼¡£

5.    λԚ´ӷ�MPʏµ¼/span>AFTER´¥·¢³͐򼤻

20.4. ´洢ؓ³͐򻍴¥·¢³͐򶄶�֖¾¹¦Ŝ

£¬֢һ½ڽꊜMySQL 5.1ɧºο¼Ç¶�֖¾¹¦Ŝ4´¦m´洢ؓ³͐򣨳͐򻍺¯˽£© ¡£֢һ½ے²ˊԃԚ´¥·¢³͐򡡠

¶�֖¾°�Ŋ�ۈݵÓQLԯ¾䶄хϢ¡£֢¸�¢ӔĨ˶ў¸ĵŊ¼�½±£´燰4¡£

¶�֖¾Ԑ}¸�ªĿµģº

·         ¸´׆µĻ�׷·�¢̍°��֖¾oµŊ¼��¬´ӷ�´ѐ֢Щ˂¼�ʓ뷔׷·�촉µō¬ҹµŊ�䣬ȫ²ϔ¼a href="http://book.chinaz.com/mysql5/replication.html#replication-implementation" title="6.2. Replication Implementation Overview">6.2½ڣ¬¡°¸´׆¸Ɗ�quo;¡£

·         ͘¶¨µŊ�´²ڗ�ªʹԃ¶�֖¾¡£±¸·ݵŎļ�´֮º󣬱¸·ݺ󽎂¼µĶ�֖¾oµŊ¼�Ö´ѐ¡£֢Щ˂¼�ݿ⵸´ӱ¸·ݵ㶄ɕؓ´�ǰ¡£ȫ²ϔ¼a href="http://book.chinaz.com/mysql5/database-administration.html#backup-recovery" title="5.9.2.2. Using Backups for Recovery">5.9.2.2½ڣ¬¡°ʹԃ±¸·ݻָ´”¡£

MySQLא£¬Ӕ´洢ؓ³͐򶄶�֖¾¹¦Ŝӽ·¢‹ºܶᏊ͢£¬֢Щ՚ЂĦ͖Ûא³��ο¼хϢ¡£

³�עӢµŖ®΢£¬֢Щ̸Û¼ډ酣ӑ¾­ͨ¹�og-binѡЮǴ¶¯·�ː¶�֖¾¹¦Ŝ¡££¨ɧ¹�׆ɕ־¹¦Ŝ²»±»Պѭ£¬¸´׆½«²»¿ʄܣ¬Ϊ˽¾ݻָ´µĶ�֖¾Ҳ²»´畚¡££©ȫ²ϔ¼a href="http://book.chinaz.com/mysql5/database-administration.html#binary-log" title="5.11.3. The Binary Log">5.11.3½ڣ¬¡°¶�֖¾”¡£

¶Դ洢ؓ³͐󔯾䶄¶�֖¾¹¦ŜµŌٕ�Ã炐±Ĩ˶¡£һЩ͵Ŀָ³�¦¸ė¢Ӣµ½µŎˌ⡣µ«ˇ՚һЩȩ¿�¬Ԑţ¿ʒԸ�¾ϥǟʨ׃»󅣿ʒՓĀ´´¦m̼ćµĹ¤طȸ¡£

·         CREATE PROCEDURE, CREATE FUNCTION, ALTER PROCEDURE,º́LTER FUNCTION ԯ¾䱻д½�׆ɕ־£¬CALL, DROP PROCEDURE, º̄ROP FUNCTION Ҳһҹ¡£

¾¡¹݈絋£¬¶Ը´׆Ԑһ¸�«°µʾ£ºҪ´´½¨һ¸�͐򣭓û§±ِ씐CREATE ROUTINEȨО,µ«Ԑ֢¸�޵œû§²»Ŝдһ¸􋋗ӳ͐󕚴ӷ�Ж´ѐɎºβڗ�󎫔ڴӷ�ϵÓQLП³͓č눫ȨО4Ջѐ¡£}ɧ£¬ɧ¹�ϱǷºʹӷ�ֱ񔐷�Dֵ1º˲£¬՚׷·�ϵœû§¿ʄܴ´½¨²¢µ�萂һ¸􋊳͐򣸠

mysql> delimiter //
mysql> CREATE PROCEDURE mysp ()
    -> BEGIN
    ->   IF @@server_id=2 THEN DROP DATABASE accounting; END IF;
    -> END;
    -> //
mysql> delimiter ;
mysql> CALL mysp();

CREATE PROCEDUREº̃ALLԯ¾佫±»д½�׆ɕ־£¬̹Ӕ´ӷ�«ִѐ̼ć¡£ӲΪ´ғQLП³͓э눫ȨО£¬̼½«ӆ³�nting˽¾ݿ⡣

ҪʹՊѭ¶�֖¾¹¦Ŝµķ�݃㖢¸�գ¬MySQL 5.1ӑ¾­Ҫȳ ´洢³͐򻍺¯˽µĴ´½¨֟³�£ѨҪµÃREATE ROUTINEµň¨О΢£¬»¹±ِ씐SUPER ȨО¡£`̆µأ¬ҪʹԃALTER PROCEDURE»񀋔ER FUNCTION£¬³�ER ROUTINEȨО΢ţ±ِ씐SUPERȨО¡£ûԐSUPERȨО£¬½«»ᷢʺһ¸�󣸼/span>

ERROR 1419 (HY000): You do not have the SUPER privilege and
binary logging is enabled (you *might* want to use the less safe
log_bin_trust_routine_creators variable)

ţ¿ʄܲ»Ыǿ׆Ҫȳؓ³͐򴴽¨֟±ِ씐SUPERȨО¡£}ɧ£¬ţϵͳʏ̹ԐԐCREATE ROUTINEȨОµœû§¿ʄ݊ȓо­ҩµœ¦ԃ³͐򿪷¢֟¡£Ҫ½�¶ӓUPERȨОµŒªȳ£¬ʨ׃log_bin_trust_routine_creators ȫ¾׏µͳ±偿Ϊ1¡£Ĭɏµأ¬֢¸�¿ֵΪ0£¬µ«ţ¿ʒՏ��֢ҹ£º

mysql> SET GLOBAL log_bin_trust_routine_creators = 1;

ţҲ¿ʒՔۆ��®ʱԃ--log-bin-trust-routine-creatorsѡЮ4ʨ׃Պѭ֢¸�¿¡£

ɧ¹�׆ɕ־¹¦Ŝ²»±»Պѭ£¬log_bin_trust_routine_creators ûԐ±»ԃʏ£¬ؓ³͐򴴽¨ѨҪSUPERȨО¡£

·         һ¸�и�Ȉ·¶¨ؓ³͐󋇲»¿ʖظ´µģ¬̼ŜԐ}¸�蓢µœ°Ь£º

o        ̼»⊹µôӷ�»ͬԚ׷·�span>¡£

-        »ָ´µŊ�­ʼ˽¾ݲ»ͬ¡£

Ҫ½⿶֢Щϊ͢£¬MySQLǿ׆ضЂĦҪȳ£º՚׷·�ϣ¬³�͐򱼉�ȷ¶¨єµĻ󖟲»¸�ݣ¬·򕲴´½¨»󖠌滻ؓ³͐򽫱»¾ܾ�Ӣζ؅µ±ţ´´½¨һ¸�͐򶅊±º򣭄㲘ѫҪôʹķ̼ˇȷ¶¨єµģ¬Ҫô̼²»¸ı勽¾ݡ£}͗ؓ³͐󍙕�はˊԃ£º

-        DETERMINISTICº̎OT DETERMINISTICָ³��͐󋇷񷔸�ˤɫ؜ˇ²�ҹµĽẻ¡£ɧ¹�¸�һַ͘£¬ĬɏˇNOT DETERMINISTIC£¬̹Ӕţ±ِ섷ȷָ¶¨DETERMINISTIC4 ʹķһ¸􋋗ӳ͐󋈈·¶¨єµġ£

ʹԃNOW() º¯˽£¨»󌼵ō¬ӥ£©»󖞒AND() º¯˽²»ˇ±ْªµي¹Ҳһ¸�͐򸈈·¶¨є¡£¶ӎOW()¶�¶�֖¾°�䵁²¢ֽȷ¸´׆¡£RAND()ֻҪ՚һ¸􋋗ӳ͐󅚱»µ�»´ϒ²¿ʒՕ�ơ££¨ţ¿ʒՈЎªؓ³͐󖵐ъ±¼䵁º΋漺˽זؓطΪºŽߒʎʵي剫£¬̼ć՚׷·�ʹӷ�ЊȒ»ҹµġ££©

-        CONTAINS SQL, NO SQL, READS SQL DATA, ºˠMODIFIES SQL˽¾ތṩؓ³͐󋇶{¹ˇд˽¾ݵŐƏ¢¡£ϞÛNO SQL »¹ˇREADS SQL DATA i¶¼ָ³�ӳ͐󃼓иı勽¾ݣ¬µ«ţ±ِ섷°׵ٖ¸ķ֢ЩאµŒ»¸�󎫈纻Ɏºϕ㐩ַ͘ûԐ±»¸� ĬɏµŌٕ�ONTAINS SQL¡£

Ĭɏµأ¬Ҫһ¸�ATE PROCEDURE »🂒EATE FUNCTION ԯ¾䱻½Ԋܣ¬DETERMINISTIC »🍏 SQLԫREADS SQL DATA אµŒ»¸�섷°׵ٖ¸¶¨£¬·򕲻ᳺʺɧЂ´£º

ERROR 1418 (HY000): This routine has none of DETERMINISTIC, NO SQL,
or READS SQL DATA in its declaration and binary logging is enabled
(you *might* want to use the less safe log_bin_trust_routine_creators
variable)

ɧ¹�log_bin_trust_routine_creators Ϊ1, ӆ³�͐򲙐싇ȷ¶¨µĻ򲼐޸Ŋ�ªȳ¡£

עӢ£¬ؓ³͐򱿐Եņ9Jǻ�½¨֟µ¼/span>“³Њµ¶Ʀrdquo; £ºMySQL²»¼쳩ʹķΪȷ¶¨єµŗӳ͐󋇷񲻺¬²�ȷ¶¨є½ẻµœ¦¡£

·         ɧ¹�Ѳ·µ»َ޴CALLԯ¾䱻д½�׆ɕ־£¬·򕲾Ͳ»д¡£µ±һ¸�͐󑞸Ŋ�݁ˣ¬ţ»ᶃµ½֢ҹµľ¯¸棺

¡¤                ERROR 1417 (HY000): A routine failed and has neither NO SQL nor
¡¤                READS SQL DATA in its declaration and binary logging is enabled; if
¡¤                non-transactional tables were updated, the binary log will miss their
¡¤                changes

֢¸�֖¾ѐΪDZ՚µص¼ׂϊ͢.ɧ¹�ؓ³͐򲿷ֵِ޸Œ»¸�»»¥±±Ɉ蒻¸�SAM±젢le£©²¢Ȓ·µ»ْ»¸�󣬶�֖¾½«·´ӳ֢Щ±仯¡£Ҫ·V¹֢זȩ¿�䓦¸Ĕ؍ ؓ³͐󗑊¹ԃ½»»¥±Ȓ՚½»»¥¶¯طŚў¸ı

՚һ¸�͐󅚣¬ɧ¹�INSERT, DELETE, »󖞕PDATEoʹԃIGNORE¹ؼ��£¬¿ʄܷ¢ʺһ¸�ָ�«ûԐ´²�֢ҹµœ¦±»¼Ȃ¼ɕ־£¬Ȓֽ³£¸´׆¡£

·         ɧ¹�´洢º¯˽՚һ¸�ELECT֢ҹ²»ў¸Ŋ�¦ڱ»µ�¬¼´ʹº¯˽±¾ʭ¸�ݣ¬º¯˽µŖ´ѐҲ½«²»±»д½�׆ɕ־o¡£֢¸�¼ɕ־µŐюªDZ՚µص¼ׂϊ͢¡£¼ډ躯˽myfunc()ɧЂ¶¨ӥ£º

¡¤                CREATE FUNCTION myfunc () RETURNS INT
¡¤                BEGIN
¡¤                  INSERT INTO t (i) VALUES(1);
¡¤                  RETURN 0;
¡¤                END;

°´֕ʏĦ¶¨ӥ£¬ЂĦµœ¦ў¸¼span>±촣¬ӲΪmyfunc()ў¸ı첬 µ«ˇԯ¾䲻±»д½�׆ɕ־£¬ӲΪ̼ˇһ¸�ECTԯ¾䣺

SELECT myfunc();

¶Օ⹶ϊ͢µĹ¤طȸ½«µ�ۗ�µœ¦oض¸�¯˽¡£עӢ£¬̤ȻDOԯ¾唐ʱΪ‹Ǥ¹K㲭´𐊽µĸ±ЧӦ¶�ѐ£¬DO՚֢o²»ˇһ¸��¬ӲΪ̼²»±»д½�׆ɕ־¡£

·         ՚һ¸�͐󅛖´ѐµœ¦²»±»д½�׆ɕ־¡£¼ڈ腣·¢²¼Ђԯ¾䣺

¡¤                CREATE PROCEDURE mysp INSERT INTO t VALUES(1);
¡¤                CALL mysp;

¶Փە⹶}ؓ4˵£¬CREATE PROCEDURE º̃ALLԯ¾䴶Ж՚¶�֖¾o£¬µ«INSERTԯ¾䲢δ³�£

·         ՚´ӷ�ϣ¬µ±¾�´׆ń¸�Ֆ�򇷵Ŋ¼�ÁяߖƱ»Ӧԃ£º--replicate-*-table¹畲²»ˊԃԚCALLԯ¾伲ؓ³͐󅚵œ¦£º՚֢Щȩ¿�¬؜ˇ·µ»ּ/span>¡°¸´׆£¡”

´¥·¢³͐󁡋Ǔڴ洢º¯˽£¬̹Ӕǰ˶µņBܒ²ˊԃԚ´¥·¢³͐򣬳�чꀶ£º CREATE TRIGGERûԐ¿ʑ¡µÄETERMINISTICַ͘£¬̹Ӕ´¥·¢³͐򱻼ٶ¨Ϊ؜ˇȷ¶¨єµġ£Ȼ¶�¸�镚һЩȩ¿�ǷǷ¨µġ£±Ɉ磬UUID()º¯˽ˇ·Ȉ·¶¨єµģ¨²»Ŝ¸´׆£©¡£ţӦ¸Đ¡ф՚ ´¥·¢³͐󗑊¹ԃ֢¸��:p>

´¥·¢³͐󅀇°²»Ŝ¸�¬µ«ˇ՚½«4»▧³֡£ӲΪ֢¸�򣭈纻ţûԐSUPERȨОȒlog_bin_trust_routine_creators ±»ʨΪ0£¬µõ½µĴхϢ`̆Ԛ´洢ؓ³͐󔪃REATE TRIGGER²�´хϢ¡£

՚±¾½ۖѐ񋶵Ŏˌ〴ؔ·¢ʺ՚SQLԯ¾伶±𶄶�֖¾¼Ȃ¼µŊʵ¡£δ4·¢ѐµÍySQLǚλŜʵЖѐ¼¶µĶ�֖¾¼Ȃ¼£¬¼Ȃ¼·¢ʺ՚¸�µļ¶±𲣇Ӗ¸³��嘷ΪִѐSQLµĽẻ¶Ե¥¸�¼¶�


֢ˇMySQL²ο¼˖²ᶄ·­ӫ°汾£¬¹ٍٓySQL²ο¼˖²ᣬȫ·Ďȼa href="http://dev.mysql.com/doc/mysql/en" target="_top">dev.mysql.com¡£ԭʼ²ο¼˖²⎪Ӣτ°棬ԫӢτ°泎¿¼˖²␠±ȣ¬±¾·­ӫ°瀉Ŝ²»ˇخтµġ£