姣忔鎴戞兂瑕佹紨紺哄疄闄呬唬鐮佹椂錛屾垜浼氬mysql瀹㈡埛绔殑灞忓箷灝卞嚭鐜扮殑浠g爜榪涜璋冩暣錛屽皢瀛椾綋鏀規垚Courier錛屼嬌浠栦滑鐪嬭搗鏉ヤ笌鏅氭枃鏈笉涓鏍鳳紙璁╁ぇ瀹跺尯鍒▼搴忎唬鐮佸拰姝f枃錛夈傚湪榪欓噷涓句釜渚嬪瓙錛?/font>
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銆丮ysql 5.0.3鍏叡鐗堜笂嫻嬭瘯閫氳繃銆傚湪鎮ㄩ槄璇繪湰涔︾殑鏃跺欙紝Mysql宸茬粡鏈夋洿楂樼殑鐗堟湰錛屽悓鏃惰兘鏀寔鏇村OS浜嗭紝鍖呮嫭Windows錛孲parc錛孒P-UX銆傚洜姝よ繖閲岀殑渚嬪瓙灝嗚兘姝e父鐨勮繍琛屽湪鎮ㄧ殑鐢佃剳涓娿備絾濡傛灉榪愯浠嶇劧鍑虹幇鏁呴殰錛屽彲浠ュ挩璇綘璁よ瘑鐨勮祫娣盡ysql鐢ㄦ埛錛岃繖鏍峰氨鑳藉緱鍒版瘮杈冨ソ鐨勬敮鎸佸拰甯姪銆?br />
涓轟粈涔堣鐢ㄨЕ鍙戝櫒
鎴戜滑鍦∕ySQL 5.0涓寘鍚瑙﹀彂鍣ㄧ殑鏀寔鏄敱浜庝互涓嬪師鍥?
MySQL鏃╂湡鐗堟湰鐨勭敤鎴烽暱鏈熸湁闇瑕佽Е鍙戝櫒鐨勮姹傘?
鎴戜滑鏇劇粡璁歌鏀寔鎵鏈堿NSI鏍囧噯鐨勭壒鎬с?
鎮ㄥ彲浠ヤ嬌鐢ㄥ畠鏉ユ鏌ユ垨棰勯槻鍧忕殑鏁版嵁榪涘叆鏁版嵁搴撱?
鎮ㄥ彲浠ユ敼鍙樻垨鑰呭彇娑圛NSERT, UPDATE浠ュ強DELETE璇彞銆?
鎮ㄥ彲浠ュ湪涓涓細璇濅腑鐩戣鏁版嵁鏀瑰彉鐨勫姩浣溿?/font>
鍦ㄨ繖閲屾垜鍋囧畾澶у閮借榪?MySQL鏂扮壒鎬?涓涗功鐨勭涓闆?-"MySQL瀛樺偍榪囩▼"錛岄偅涔堝ぇ瀹墮兘搴旇鐭ラ亾MySQL鑷蟲瀛樺偍榪囩▼鍜屽嚱鏁幫紝閭f槸寰堥噸瑕佺殑鐭ヨ瘑錛屽洜涓哄湪瑙﹀彂鍣ㄤ腑浣犲彲浠ヤ嬌鐢ㄥ湪鍑芥暟涓嬌鐢ㄧ殑璇彞銆傜壒鍒婦涓緥瀛愶細
澶嶅悎璇彞(BEGIN / END)鏄悎娉曠殑.
嫻佹帶鍒訛紙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
鍦ㄨЕ鍙戝櫒涓篃鏈夊畬鍏ㄤ竴鏍風殑闄愬埗.
瑙﹀彂鍣ㄧ浉瀵硅岃█姣旇緝鏂幫紝鍥犳浼氭湁錛坆ugs錛夌己闄?鎵浠ユ垜鍦ㄨ繖閲岀粰澶у璀﹀憡錛屽氨鍍忔垜鍦ㄥ瓨鍌ㄨ繃紼嬩功涓墍璇撮偅鏍?涓嶈鍦ㄥ惈鏈夐噸瑕佹暟鎹殑鏁版嵁搴撲腑浣跨敤榪欎釜瑙﹀彂鍣紝濡傛灉闇瑕佺殑璇濆湪涓浜涗互嫻嬭瘯涓虹洰鐨勭殑鏁版嵁搴撲笂浣跨敤錛屽悓鏃跺湪浣犲琛ㄥ垱寤鴻Е鍙戝櫒鏃剁‘璁よ繖浜涙暟鎹簱鏄粯璁ょ殑銆?br />
璇硶
1. 璇硶錛氬懡鍚嶈鍒?
CREATE TRIGGER <瑙﹀彂鍣ㄥ悕縐?gt; <--
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <琛ㄥ悕縐?gt;
FOR EACH ROW
<瑙﹀彂鍣⊿QL璇彞>
瑙﹀彂鍣ㄥ繀欏繪湁鍚嶅瓧錛屾渶澶?4涓瓧絎︼紝鍙兘鍚庨潰浼氶檮鏈夊垎闅旂.瀹冨拰MySQL涓叾浠栧璞$殑鍛藉悕鏂瑰紡鍩烘湰鐩歌薄.
榪欓噷鎴戞湁涓範鎯細灝辨槸鐢ㄨ〃鐨勫悕瀛楋紜'_'錛嬭Е鍙戝櫒綾誨瀷鐨勭緝鍐?鍥犳濡傛灉鏄〃t26錛岃Е鍙戝櫒鏄湪浜嬩歡UPDATE錛堝弬鑰冧笅闈㈢殑鐐癸紙2錛夊拰錛?錛夛級涔嬪墠錛圔EFORE錛夌殑錛岄偅涔堝畠鐨勫悕瀛楀氨鏄痶26_bu銆?
2. 璇硶錛氳Е鍙戞椂闂?
CREATE TRIGGER <瑙﹀彂鍣ㄥ悕縐?gt;
{ BEFORE | AFTER } <--
{ INSERT | UPDATE | DELETE }
ON <琛ㄥ悕縐?gt;
FOR EACH ROW
<瑙﹀彂鐨凷QL璇彞>
瑙﹀彂鍣ㄦ湁鎵ц鐨勬椂闂磋緗細鍙互璁劇疆涓轟簨浠跺彂鐢熷墠鎴栧悗銆?
3. 璇硶錛氫簨浠?
CREATE TRIGGER <瑙﹀彂鍣ㄥ悕縐?gt;
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE } <--
ON <琛ㄥ悕縐?gt;
FOR EACH ROW
<瑙﹀彂鐨凷QL璇彞>
鍚屾牱涔熻兘璁懼畾瑙﹀彂鐨勪簨浠訛細瀹冧滑鍙互鍦ㄦ墽琛宨nsert銆乽pdate鎴杁elete鐨勮繃紼嬩腑瑙﹀彂銆?
4. 璇硶錛氳〃
CREATE TRIGGER <瑙﹀彂鍣ㄥ悕縐?gt;
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <琛ㄥ悕縐?gt; <--
FOR EACH ROW
<瑙﹀彂鐨凷QL璇彞>
瑙﹀彂鍣ㄦ槸灞炰簬鏌愪竴涓〃鐨?褰撳湪榪欎釜琛ㄤ笂鎵ц鎻掑叆銆?
鏇存柊鎴栧垹闄ゆ搷浣滅殑鏃跺欏氨瀵艱嚧瑙﹀彂鍣ㄧ殑嬋媧?
鎴戜滑涓嶈兘緇欏悓涓寮犺〃鐨勫悓涓涓簨浠跺畨鎺掍袱涓Е鍙戝櫒銆?
5. 璇硶錛氾紙 姝ラ暱錛夎Е鍙戦棿闅?
CREATE TRIGGER <瑙﹀彂鍣ㄥ悕縐?gt;
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <琛ㄥ悕縐?gt;
FOR EACH ROW <--
<瑙﹀彂鐨凷QL璇彞>
瑙﹀彂鍣ㄧ殑鎵ц闂撮殧錛欶OR EACH ROW瀛愬彞閫氱煡瑙﹀彂鍣?
姣忛殧涓琛屾墽琛屼竴嬈″姩浣滐紝鑰屼笉鏄鏁翠釜琛ㄦ墽琛屼竴嬈°?
6. 璇硶錛氳鍙?
CREATE TRIGGER <瑙﹀彂鍣ㄥ悕縐?gt;
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <琛ㄥ悕縐?gt;
FOR EACH ROW
<瑙﹀彂鐨凷QL璇彞> <--
瑙﹀彂鍣ㄥ寘鍚墍瑕佽Е鍙戠殑SQL璇彞錛氳繖閲岀殑璇彞鍙互鏄換浣曞悎娉曠殑璇彞錛?
鍖呮嫭澶嶅悎璇彞錛屼絾鏄繖閲岀殑璇彞鍙楃殑闄愬埗鍜屽嚱鏁扮殑涓鏍楓?
Privileges鏉冮檺
浣犲繀欏繪嫢鏈夌浉褰撳ぇ鐨勬潈闄愭墠鑳藉垱寤鴻Е鍙戝櫒錛圕REATE TRIGGER錛夈?
濡傛灉浣犲凡緇忔槸Root鐢ㄦ埛錛岄偅涔堝氨瓚沖浜嗐傝繖璺烻QL鐨勬爣鍑嗘湁鎵涓嶅悓銆?
鍥犳鍦ㄤ笅涓涓増鏈殑MySQL涓紝
浣犲畬鍏ㄦ湁鍙兘鐪嬪埌鏈変竴縐嶅彨鍋欳REATE TRIGGER鐨勬柊鏉冮檺銆?
鐒跺悗閫氳繃榪欐牱鐨勬柟娉曡祴浜堬細
GRANT CREATE TRIGGER ON <琛ㄥ悕縐?gt; TO <鐢ㄦ埛鎴栫敤鎴峰垪琛?gt;;
涔熷彲浠ラ氳繃榪欐牱鏀跺洖鏉冮檺錛?
REVOKE CREATE TRIGGER ON <琛ㄥ悕縐?gt; FROM <鐢ㄦ埛鎴栫敤鎴峰垪琛?gt;;
鍏充簬鏃х殑鍜屾柊鍒涘緩鐨勫垪鐨勬爣璇?/strong>
鍦ㄨЕ鍙戝櫒鐨凷QL璇彞涓紝浣犲彲浠ュ叧鑱旇〃涓殑浠繪剰鍒椼備絾浣犱笉鑳戒粎浣跨敤鍒楃殑鍚嶇О鍘繪爣璇嗭紝閭d細浣跨郴緇熸販娣嗭紝鍥犱負閭i噷鍙兘浼氭湁鍒楃殑鏂板悕錛堣繖鍙兘姝f槸浣犺淇敼鐨勶紝浣犵殑鍔ㄤ綔鍙兘姝f槸瑕佷慨鏀瑰垪鍚嶏級錛岃繕鏈夊垪鐨勬棫鍚嶅瓨鍦ㄣ傚洜姝や綘蹇呴』鐢ㄨ繖鏍風殑璇硶鏉ユ爣璇嗭細 "NEW . column_name"鎴栬?OLD . column_name".榪欐牱鍦ㄦ妧鏈笂澶勭悊錛圢EW | OLD . column_name錛夋柊鍜屾棫鐨勫垪鍚嶅睘浜庡垱寤轟簡榪囨浮鍙橀噺錛?transition variables"錛夈?
瀵逛簬INSERT璇彞,鍙湁NEW鏄悎娉曠殑錛涘浜嶥ELETE璇彞錛屽彧鏈塐LD鎵嶅悎娉曪紱鑰孶PDATE璇彞鍙互鍦ㄥ拰NEW浠ュ強OLD鍚屾椂浣跨敤銆備笅闈㈡槸涓涓猆PDATE涓悓鏃朵嬌鐢∟EW鍜孫LD鐨勪緥瀛愩?/font>
CREATE TRIGGER t21_au
BEFORE UPDATE ON t22
FOR EACH ROW
BEGIN
SET @old = OLD . s1;
SET @new = NEW.s1;
END;//
鐜板湪濡傛灉t21琛ㄤ腑鐨剆1鍒楃殑鍊兼槸55錛岄偅涔堟墽琛屼簡
"UPDATE t21 SET s1 = s1 + 1"涔嬪悗@old鐨勫間細鍙樻垚55錛?
鑰孈new鐨勫煎皢浼氬彉鎴?6銆?/font>
Example of CREATE and INSERT CREATE鍜孖NSERT鐨勪緥瀛?
鍒涘緩鏈夎Е鍙戝櫒鐨勮〃
榪欓噷鎵鏈夌殑渚嬬▼涓垜閮藉亣瀹氬ぇ瀹剁殑鍒嗛殧絎﹀凡緇忚緗垚//錛圖ELIMITER //錛夈?
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鐨勮〃錛岀劧鍚庡湪琛╰22涓婂垱寤轟簡涓涓Е鍙戝櫒t22_bi錛屽綋鎴戜滑瑕佸悜琛ㄤ腑鐨勮鎻掑叆鏃訛紝瑙﹀彂鍣ㄥ氨浼氳嬋媧伙紝鎵ц灝唖1鍒楃殑鍊兼敼涓?5鐨勫姩浣溿?br />
浣跨敤瑙﹀彂鍣ㄦ墽琛屾彃鍏ュ姩浣?
mysql> INSERT INTO t22 VALUES (1)//
璁╂垜浠湅濡傛灉鍚戣〃t2涓彃鍏ヤ竴琛屾暟鎹Е鍙戝櫒瀵瑰簲鐨勮〃浼氭庝箞鏍鳳紵 榪欓噷鐨勬彃鍏ョ殑鍔ㄤ綔鏄緢甯歌鐨勶紝鎴戜滑涓嶉渶瑕佽Е鍙戝櫒鐨勬潈闄愭潵鎵ц瀹冦傜敋鑷充笉闇瑕佺煡閬撴槸鍚︽湁瑙﹀彂鍣ㄥ叧鑱斻?/font>
mysql> 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), PRIMARY KEY (s1),
CHECK (LEFT(s2,1)='A'))
ENGINE=INNODB;
榪欓噷CHECK鐨勬剰鎬濇槸"褰搒2鍒楃殑鏈宸﹁竟鐨勫瓧絎︿笉鏄?A'鏃訛紝insert鍜寀pdate璇彞閮戒細闈炴硶"錛孧ySQL鐨勮鍥句笉鏀寔CHECK錛屾垜涓漢鏄緢甯屾湜瀹冭兘鏀寔鐨勩備絾濡傛灉浣犲緢闇瑕佸湪琛ㄤ腑浣跨敤榪欐牱鐨勫姛鑳斤紝鎴戝緩璁ぇ瀹朵嬌鐢ㄨЕ鍙戝櫒鏉ュ疄鐜般?/font>
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;//
鎴戝彧闇瑕佷嬌鐢˙EFORE INSERT鍜孊EFORE UPDATE璇彞灝辮浜嗭紝鍒犻櫎浜嗚Е鍙戝櫒涓嶄細瀵硅〃鏈夊獎鍝嶏紝鍚屾椂AFTER鐨勮Е鍙戝櫒涔熶笉鑳戒慨鏀筃EW鐨勮繃紼嬪彉閲忥紙transition variables錛夈備負浜嗘縺媧昏Е鍙戝櫒錛屾垜鎵ц浜嗗悜琛ㄤ腑鐨勮鎻掑叆s1錛?鐨勬暟鎹紝涔嬪悗鍙鎵ц絎﹀悎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 Manual
璇ユ姏寮冩棫鐨凪ySQL鐨勬墜鍐屼簡
鎴戝湪榪欓噷璀﹀憡澶у涓嶈鐩鎬俊榪囧幓鐨凪ySQL鎵嬪唽涓墍璇寸殑浜嗐傛垜浠凡緇忓幓鎺変簡鍏充簬瑙﹀彂鍣ㄧ殑閿欒鐨勮鍙ワ紝浣嗘槸浠嶆棫鏈夊緢澶氭棫鐗堟湰鐨勬墜鍐屽湪緗戜笂錛屼婦涓緥瀛愶紝榪欐槸涓涓痙鍥界殑Url涓婄殑錛?http://dev.mysql.com/doc/mysql/de/ANSI_diff_Triggers.html. 銆榪欎釜鎵嬪唽涓婅瑙﹀彂鍣ㄥ氨鏄瓨鍌ㄨ繃紼嬶紝蹇樻帀鍚э紝浣犱篃宸茬粡鐪嬭浜嗭紝瑙﹀彂鍣ㄥ氨鏄Е鍙戝櫒錛岃屽瓨鍌ㄨ繃紼嬭繕鏄瓨鍌ㄨ繃紼嬨?鎵嬪唽涓婅繕璇磋Е鍙戝櫒鍙互浠庡叾浠栬〃涓婃潵鍒犻櫎錛屾垨鑰呮槸褰撲綘鍒犻櫎涓涓簨鍔$殑鏃跺欐縺鍙戯紝鏃犺浠栬鐨勬槸浠涔堟剰鎬濓紝蹇樻帀鍚э紝MySQL涓嶄細鍘誨疄鐜拌繖浜涚殑銆?鏈鍚庡叧浜庤浣跨敤瑙﹀彂鍣ㄤ細瀵規煡璇㈤熷害浜х敓褰卞搷鐨勮娉曚篃鏄敊鐨勶紝瑙﹀彂鍣ㄤ笉浼氬鏌ヨ浜х敓浠諱綍褰卞搷銆?

]]>