生活随笔
收集整理的這篇文章主要介紹了
Oracle触发器和MySQL触发器之间的区别
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文鏈接:http://blog.csdn.net/a19881029/article/details/37820363
-----------------------------------------------------------
Oracle觸發(fā)器格式:
[plain]?view plain
?copyCREATE?[OR?REPLACE]?TRIGGER?trigger_name???????BEFORE|AFTER?INSERT|UPDATE|DELETE?ON?table_name???????[FOR?EACH?ROW]??DECLARE?arg_name?type?[CONSTANT]?[NOT?NULL]?[:=value]???BEGIN??????pl/sql語句??END??
MySQL觸發(fā)器格式:
[plain]?view plain
?copyCREATE?TRIGGER?trigger_name??????BEFORE|AFTER?INSERT|UPDATE|DELETE?ON?table_name??????[FOR?EACH?ROW]??BEGIN??DECLARE?arg_name1[,arg_name2,...]?type?[DEFAULT?value]??????sql語句??END??
創(chuàng)建測試表(建表語句適用于Oracle、MySQL):
[sql]?view plain
?copyCREATE?TABLE?test(????id????????????int,????name??????????varchar(10),????age???????????int,????birthday??????date,????description???varchar(50),????PRIMARY?KEY?(id)??);??CREATE?TABLE?test_log(????id????????????int,????dealtime??????date,????dealtype??????varchar(10),????PRIMARY?KEY?(`id`)??);??
Oracle觸發(fā)器和MySQL觸發(fā)器的區(qū)別如下:
1,創(chuàng)建語句格式不同
Oracle:create or replace(Oracle客戶端需要手動提交,MySQL客戶端設(shè)置的自動提交)
[plain]?view plain
?copySQL>?CREATE?OR?REPLACE?TRIGGER?trigger_test_insert????2?????????BEFORE?INSERT?ON?test????3?????????FOR?EACH?ROW????4??BEGIN????5?????????insert?into?test_log?values(1,sysdate,'insert');????6??END;????7??/?????Trigger?created?????SQL>?insert?into?test(id,?name)?values(1,?'name');?????1?row?inserted?????SQL>?commit;?????Commit?complete?????SQL>?select?*?from?test_log;??????????????????????????????????????????ID?DEALTIME????DEALTYPE??---------------------------------------?-----------?----------????????????????????????????????????????1?2014/7/16?1?insert??
MySQL:不包含or replace
[plain]?view plain
?copymysql>?delimiter?$??CREATE?TRIGGER?trigger_test_insert????????BEFORE?INSERT?ON?test???????FOR?EACH?ROW??BEGIN??????insert?into?test_log?values(1,now(),'insert');??END$??delimiter?;??Query?OK,?0?rows?affected????mysql>?insert?into?test(id,?name)?values(1,?'name');??Query?OK,?1?row?affected????mysql>?select?*?from?test_log;??+----+------------+----------+??|?id?|?dealtime???|?dealtype?|??+----+------------+----------+??|??1?|?2014-07-16?|?insert???|??+----+------------+----------+??1?row?in?set??
2,變量的聲明位置、聲明格式均不相同
Oracle:聲明位置在觸發(fā)時的執(zhí)行語句塊外部
通過%type的方式將變量與表特定字段類型相關(guān)聯(lián)的好處是:在某些情況下,修改該字段類型時不需要修改觸發(fā)器(如:字段類型由varchar(10)修改為varchar(20)時,不需要修改觸發(fā)器)
[plain]?view plain
?copySQL>?CREATE?TRIGGER?trigger_test_insert????2?????????BEFORE?INSERT?ON?test????3?????????FOR?EACH?ROW????4??DECLARE?id1?int?default?1;????5??????????id2?int:=1;????6??????????id3?test_log.id%type:=1;????7??BEGIN????8??????????insert?into?test_log?values(id1+id2+id3,sysdate,'insert');????9??END;???10??/?????Trigger?created?????SQL>?insert?into?test(id,?name)?values(1,?'name');?????1?row?inserted?????SQL>?commit;?????Commit?complete?????SQL>?select?*?from?test_log;??????????????????????????????????????????ID?DEALTIME????DEALTYPE??---------------------------------------?-----------?----------????????????????????????????????????????3?2014/7/16?1?insert??
MySQL:聲明位置在觸發(fā)時的執(zhí)行語句塊內(nèi)部
[plain]?view plain
?copymysql>?delimiter?$??CREATE?TRIGGER?trigger_test_insert????????BEFORE?INSERT?ON?test???????FOR?EACH?ROW??BEGIN??????DECLARE?id1?int?DEFAULT?1;??????DECLARE?id2?int?DEFAULT?1;??????insert?into?test_log?values(id1+id2,now(),'insert');??END$??delimiter?;????Query?OK,?0?rows?affected????mysql>?insert?into?test(id,?name)?values(1,?'name');??Query?OK,?1?row?affected????mysql>?select?*?from?test_log;??+----+------------+----------+??|?id?|?dealtime???|?dealtype?|??+----+------------+----------+??|??2?|?2014-07-16?|?insert???|??+----+------------+----------+??1?row?in?set??
3,注釋符不同
Oracle:使用/* */作為注釋符,或者兩個連續(xù)的-作為注釋符(PL/SQL塊中至少包含一條可執(zhí)行語句)
[sql]?view plain
?copyCREATE?OR?REPLACE?TRIGGER?trigger_test_insert????????BEFORE?INSERT?ON?test???????FOR?EACH?ROW??BEGIN??????????/*?just?a?test?*/??????null;??END;??/??
MySQL:使用/* */作為注釋符,或者兩個連續(xù)的-后加一個空格作為注釋符
[sql]?view plain
?copydelimiter?$??CREATE?TRIGGER?trigger_test_insert????????BEFORE?INSERT?ON?test???????FOR?EACH?ROW??BEGIN??????/*?just?a?test?*/????????END$??delimiter?;??
4,賦值語法不同
Oracle:可以通過select into語句賦值,還可以通過:=進(jìn)行賦值
[plain]?view plain
?copySQL>?CREATE?OR?REPLACE?TRIGGER?trigger_test_insert????2?????BEFORE?INSERT?ON?test????3?????FOR?EACH?ROW????4??DECLARE?id?int;????5??BEGIN????6?????select?max(tl.id)?into?id?from?test_log?tl;????7?????if?id?is?null?then????8?????????id:=1;????9?????else???10?????????id:=id+1;???11?????end?if;???12?????insert?into?test_log?values(id,sysdate,'insert');???13??END;???14??/?????Trigger?created?????SQL>?insert?into?test(id,?name)?values(1,?'name');?????1?row?inserted?????SQL>?commit;?????Commit?complete?????SQL>?select?*?from?test_log;??????????????????????????????????????????ID?DEALTIME????DEALTYPE??---------------------------------------?-----------?----------????????????????????????????????????????1?2014/7/16?1?insert??
MySQL:可以通過select into語句賦值,還可以通過set語句進(jìn)行賦值
[plain]?view plain
?copymysql>?delimiter?$??CREATE?TRIGGER?trigger_test_insert????????BEFORE?INSERT?ON?test???????FOR?EACH?ROW??BEGIN??????DECLARE?id?int;??????select?max(tl.id)?into?id?from?test_log?tl;??????if?id?is?null?then???????????set?id=1;??????else???????????set?id=id+1;??????end?if;??????insert?into?test_log?values(id,now(),'insert');??END$??delimiter?;????Query?OK,?0?rows?affected????mysql>?insert?into?test(id,?name)?values(1,?'name');??Query?OK,?1?row?affected????mysql>?select?*?from?test_log;??+----+------------+----------+??|?id?|?dealtime???|?dealtype?|??+----+------------+----------+??|??1?|?2014-07-16?|?insert???|??+----+------------+----------+??1?row?in?set??
5,對于行級更新觸發(fā)器
Oracle:原有行用:old表示,新行用:new表示
[plain]?view plain
?copySQL>?CREATE?OR?REPLACE?TRIGGER?trigger_test_update????2?????????BEFORE?UPDATE?ON?test????3?????????FOR?EACH?ROW????4??BEGIN????5?????????:new.description?:=?'change?name['?||????6??????????????????????????:old.name?||?']->['?||????7??????????????????????????:new.name?||?']';????8??END;????9??/?????Trigger?created?????SQL>?insert?into?test(id,?name)?values?(1,?'aaa');?????1?row?inserted?????SQL>?commit;?????Commit?complete?????SQL>?update?test?set?name?=?'bbb'?where?id?=?1;?????1?row?updated?????SQL>?commit;?????Commit?complete?????SQL>?select?id,?name,?description?from?test;??????????????????????????????????????????ID?NAME???????DESCRIPTION??---------------------------------------?----------?----------------------??????????????????????????????????????????????????????????????????????????????1?bbb????????change?name[aaa]->[bbb]??
MySQL:原有行用old表示,新行用new表示
[plain]?view plain
?copymysql>?delimiter?$??CREATE?TRIGGER?trigger_test_update????????BEFORE?UPDATE?ON?test???????FOR?EACH?ROW??BEGIN??????set?new.description?=?concat('change?name[',??????????old.name,']->[',new.name,']');??END$??delimiter?;????Query?OK,?0?rows?affected????mysql>?insert?into?test(id,?name)?values?(1,?'aaa');??Query?OK,?1?row?affected????mysql>?update?test?set?name?=?'bbb'?where?id?=?1;??Query?OK,?1?row?affected??Rows?matched:?1??Changed:?1??Warnings:?0????mysql>?select?id,?name,?description?from?test;??+----+------+-------------------------+??|?id?|?name?|?description?????????????|??+----+------+-------------------------+??|??1?|?bbb??|?change?name[aaa]->[bbb]?|??+----+------+-------------------------+??1?row?in?set??
6,其它一些語法、函數(shù)上的區(qū)別
Oracle:使用if...elsif...else
MySQL:使用if...elseif...else
Oracle:sysdate指代系統(tǒng)時間
MySQL:sysdate()指代系統(tǒng)時間
?
總結(jié)
以上是生活随笔為你收集整理的Oracle触发器和MySQL触发器之间的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。