Oracle觸發器和MySQL觸發器之間的區別

原文鏈接:http://blog.csdn.net/a19881029/article/details/37820363

-----------------------------------------------------------

Oracle觸發器格式:

[plain]?view plain?copy
  1. CREATE?[OR?REPLACE]?TRIGGER?trigger_name???
  2. ????BEFORE|AFTER?INSERT|UPDATE|DELETE?ON?table_name???
  3. ????[FOR?EACH?ROW]??
  4. DECLARE?arg_name?type?[CONSTANT]?[NOT?NULL]?[:=value]???
  5. BEGIN??
  6. ????pl/sql語句??
  7. END??

MySQL觸發器格式:

[plain]?view plain?copy
  1. CREATE?TRIGGER?trigger_name??
  2. ????BEFORE|AFTER?INSERT|UPDATE|DELETE?ON?table_name??
  3. ????[FOR?EACH?ROW]??
  4. BEGIN??
  5. DECLARE?arg_name1[,arg_name2,...]?type?[DEFAULT?value]??
  6. ????sql語句??
  7. END??

創建測試表(建表語句適用于Oracle、MySQL):

[sql]?view plain?copy
  1. CREATE?TABLE?test(??
  2. ??id????????????int,??
  3. ??name??????????varchar(10),??
  4. ??age???????????int,??
  5. ??birthday??????date,??
  6. ??description???varchar(50),??
  7. ??PRIMARY?KEY?(id)??
  8. );??
  9. CREATE?TABLE?test_log(??
  10. ??id????????????int,??
  11. ??dealtime??????date,??
  12. ??dealtype??????varchar(10),??
  13. ??PRIMARY?KEY?(`id`)??
  14. );??

Oracle觸發器和MySQL觸發器的區別如下:

1,創建語句格式不同

Oracle:create or replace(Oracle客戶端需要手動提交,MySQL客戶端設置的自動提交

[plain]?view plain?copy
  1. SQL>?CREATE?OR?REPLACE?TRIGGER?trigger_test_insert??
  2. ??2?????????BEFORE?INSERT?ON?test??
  3. ??3?????????FOR?EACH?ROW??
  4. ??4??BEGIN??
  5. ??5?????????insert?into?test_log?values(1,sysdate,'insert');??
  6. ??6??END;??
  7. ??7??/??
  8. ???
  9. Trigger?created??
  10. ???
  11. SQL>?insert?into?test(id,?name)?values(1,?'name');??
  12. ???
  13. 1?row?inserted??
  14. ???
  15. SQL>?commit;??
  16. ???
  17. Commit?complete??
  18. ???
  19. SQL>?select?*?from?test_log;??
  20. ???
  21. ?????????????????????????????????????ID?DEALTIME????DEALTYPE??
  22. ---------------------------------------?-----------?----------??
  23. ??????????????????????????????????????1?2014/7/16?1?insert??

MySQL:不包含or replace

[plain]?view plain?copy
  1. mysql>?delimiter?$??
  2. CREATE?TRIGGER?trigger_test_insert????
  3. ????BEFORE?INSERT?ON?test???
  4. ????FOR?EACH?ROW??
  5. BEGIN??
  6. ????insert?into?test_log?values(1,now(),'insert');??
  7. END$??
  8. delimiter?;??
  9. Query?OK,?0?rows?affected??
  10. ??
  11. mysql>?insert?into?test(id,?name)?values(1,?'name');??
  12. Query?OK,?1?row?affected??
  13. ??
  14. mysql>?select?*?from?test_log;??
  15. +----+------------+----------+??
  16. |?id?|?dealtime???|?dealtype?|??
  17. +----+------------+----------+??
  18. |??1?|?2014-07-16?|?insert???|??
  19. +----+------------+----------+??
  20. 1?row?in?set??

2,變量的聲明位置、聲明格式均不相同

Oracle:聲明位置在觸發時的執行語句塊外部

通過%type的方式將變量與表特定字段類型相關聯的好處是:在某些情況下,修改該字段類型時不需要修改觸發器(如:字段類型由varchar(10)修改為varchar(20)時,不需要修改觸發器)

[plain]?view plain?copy
  1. SQL>?CREATE?TRIGGER?trigger_test_insert??
  2. ??2?????????BEFORE?INSERT?ON?test??
  3. ??3?????????FOR?EACH?ROW??
  4. ??4??DECLARE?id1?int?default?1;??
  5. ??5??????????id2?int:=1;??
  6. ??6??????????id3?test_log.id%type:=1;??
  7. ??7??BEGIN??
  8. ??8??????????insert?into?test_log?values(id1+id2+id3,sysdate,'insert');??
  9. ??9??END;??
  10. ?10??/??
  11. ???
  12. Trigger?created??
  13. ???
  14. SQL>?insert?into?test(id,?name)?values(1,?'name');??
  15. ???
  16. 1?row?inserted??
  17. ???
  18. SQL>?commit;??
  19. ???
  20. Commit?complete??
  21. ???
  22. SQL>?select?*?from?test_log;??
  23. ???
  24. ?????????????????????????????????????ID?DEALTIME????DEALTYPE??
  25. ---------------------------------------?-----------?----------??
  26. ??????????????????????????????????????3?2014/7/16?1?insert??

MySQL:聲明位置在觸發時的執行語句塊內部

[plain]?view plain?copy
  1. mysql>?delimiter?$??
  2. CREATE?TRIGGER?trigger_test_insert????
  3. ????BEFORE?INSERT?ON?test???
  4. ????FOR?EACH?ROW??
  5. BEGIN??
  6. ????DECLARE?id1?int?DEFAULT?1;??
  7. ????DECLARE?id2?int?DEFAULT?1;??
  8. ????insert?into?test_log?values(id1+id2,now(),'insert');??
  9. END$??
  10. delimiter?;??
  11. ??
  12. Query?OK,?0?rows?affected??
  13. ??
  14. mysql>?insert?into?test(id,?name)?values(1,?'name');??
  15. Query?OK,?1?row?affected??
  16. ??
  17. mysql>?select?*?from?test_log;??
  18. +----+------------+----------+??
  19. |?id?|?dealtime???|?dealtype?|??
  20. +----+------------+----------+??
  21. |??2?|?2014-07-16?|?insert???|??
  22. +----+------------+----------+??
  23. 1?row?in?set??

3,注釋符不同

Oracle:使用/* */作為注釋符,或者兩個連續的-作為注釋符(PL/SQL塊中至少包含一條可執行語句

[sql]?view plain?copy
  1. CREATE?OR?REPLACE?TRIGGER?trigger_test_insert????
  2. ????BEFORE?INSERT?ON?test???
  3. ????FOR?EACH?ROW??
  4. BEGIN??
  5. ????--just?a?test??
  6. ??/*?just?a?test?*/??
  7. ????null;??
  8. END;??
  9. /??

MySQL:使用/* */作為注釋符,或者兩個連續的-后加一個空格作為注釋符

[sql]?view plain?copy
  1. delimiter?$??
  2. CREATE?TRIGGER?trigger_test_insert????
  3. ????BEFORE?INSERT?ON?test???
  4. ????FOR?EACH?ROW??
  5. BEGIN??
  6. ????/*?just?a?test?*/??
  7. ????--?兩個‘-’后面必須帶空格??
  8. END$??
  9. delimiter?;??

4,賦值語法不同

Oracle:可以通過select into語句賦值,還可以通過:=進行賦值

[plain]?view plain?copy
  1. SQL>?CREATE?OR?REPLACE?TRIGGER?trigger_test_insert??
  2. ??2?????BEFORE?INSERT?ON?test??
  3. ??3?????FOR?EACH?ROW??
  4. ??4??DECLARE?id?int;??
  5. ??5??BEGIN??
  6. ??6?????select?max(tl.id)?into?id?from?test_log?tl;??
  7. ??7?????if?id?is?null?then??
  8. ??8?????????id:=1;??
  9. ??9?????else??
  10. ?10?????????id:=id+1;??
  11. ?11?????end?if;??
  12. ?12?????insert?into?test_log?values(id,sysdate,'insert');??
  13. ?13??END;??
  14. ?14??/??
  15. ???
  16. Trigger?created??
  17. ???
  18. SQL>?insert?into?test(id,?name)?values(1,?'name');??
  19. ???
  20. 1?row?inserted??
  21. ???
  22. SQL>?commit;??
  23. ???
  24. Commit?complete??
  25. ???
  26. SQL>?select?*?from?test_log;??
  27. ???
  28. ?????????????????????????????????????ID?DEALTIME????DEALTYPE??
  29. ---------------------------------------?-----------?----------??
  30. ??????????????????????????????????????1?2014/7/16?1?insert??

MySQL:可以通過select into語句賦值,還可以通過set語句進行賦值

[plain]?view plain?copy
  1. mysql>?delimiter?$??
  2. CREATE?TRIGGER?trigger_test_insert????
  3. ????BEFORE?INSERT?ON?test???
  4. ????FOR?EACH?ROW??
  5. BEGIN??
  6. ????DECLARE?id?int;??
  7. ????select?max(tl.id)?into?id?from?test_log?tl;??
  8. ????if?id?is?null?then???
  9. ????????set?id=1;??
  10. ????else???
  11. ????????set?id=id+1;??
  12. ????end?if;??
  13. ????insert?into?test_log?values(id,now(),'insert');??
  14. END$??
  15. delimiter?;??
  16. ??
  17. Query?OK,?0?rows?affected??
  18. ??
  19. mysql>?insert?into?test(id,?name)?values(1,?'name');??
  20. Query?OK,?1?row?affected??
  21. ??
  22. mysql>?select?*?from?test_log;??
  23. +----+------------+----------+??
  24. |?id?|?dealtime???|?dealtype?|??
  25. +----+------------+----------+??
  26. |??1?|?2014-07-16?|?insert???|??
  27. +----+------------+----------+??
  28. 1?row?in?set??

5,對于行級更新觸發器

Oracle:原有行用:old表示,新行用:new表示

[plain]?view plain?copy
  1. SQL>?CREATE?OR?REPLACE?TRIGGER?trigger_test_update??
  2. ??2?????????BEFORE?UPDATE?ON?test??
  3. ??3?????????FOR?EACH?ROW??
  4. ??4??BEGIN??
  5. ??5?????????:new.description?:=?'change?name['?||??
  6. ??6??????????????????????????:old.name?||?']->['?||??
  7. ??7??????????????????????????:new.name?||?']';??
  8. ??8??END;??
  9. ??9??/??
  10. ???
  11. Trigger?created??
  12. ???
  13. SQL>?insert?into?test(id,?name)?values?(1,?'aaa');??
  14. ???
  15. 1?row?inserted??
  16. ???
  17. SQL>?commit;??
  18. ???
  19. Commit?complete??
  20. ???
  21. SQL>?update?test?set?name?=?'bbb'?where?id?=?1;??
  22. ???
  23. 1?row?updated??
  24. ???
  25. SQL>?commit;??
  26. ???
  27. Commit?complete??
  28. ???
  29. SQL>?select?id,?name,?description?from?test;??
  30. ???
  31. ?????????????????????????????????????ID?NAME???????DESCRIPTION??
  32. ---------------------------------------?----------?----------------------????????????????????????????????????????
  33. ??????????????????????????????????????1?bbb????????change?name[aaa]->[bbb]??

MySQL:原有行用old表示,新行用new表示

[plain]?view plain?copy
  1. mysql>?delimiter?$??
  2. CREATE?TRIGGER?trigger_test_update????
  3. ????BEFORE?UPDATE?ON?test???
  4. ????FOR?EACH?ROW??
  5. BEGIN??
  6. ????set?new.description?=?concat('change?name[',??
  7. ????????old.name,']->[',new.name,']');??
  8. END$??
  9. delimiter?;??
  10. ??
  11. Query?OK,?0?rows?affected??
  12. ??
  13. mysql>?insert?into?test(id,?name)?values?(1,?'aaa');??
  14. Query?OK,?1?row?affected??
  15. ??
  16. mysql>?update?test?set?name?=?'bbb'?where?id?=?1;??
  17. Query?OK,?1?row?affected??
  18. Rows?matched:?1??Changed:?1??Warnings:?0??
  19. ??
  20. mysql>?select?id,?name,?description?from?test;??
  21. +----+------+-------------------------+??
  22. |?id?|?name?|?description?????????????|??
  23. +----+------+-------------------------+??
  24. |??1?|?bbb??|?change?name[aaa]->[bbb]?|??
  25. +----+------+-------------------------+??
  26. 1?row?in?set??

6,其它一些語法、函數上的區別

Oracle:使用if...elsif...else

MySQL:使用if...elseif...else

Oracle:sysdate指代系統時間

MySQL:sysdate()指代系統時間

?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538028.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

下列選項中不符合python語言變量命名規則的是_學習Python第二日--基本概念和類型...

編程語言分類:解釋型語言和編譯型語言。解釋型語言不會產生額外的文件,運行時一行一行的翻譯。編譯型語言需要產生一個額外的文件,是電腦能夠識別的內容,運行后將產生額外的文件。 變量是可變的量,是它的值可以發生改變。變量的作用是保存值,保存的值可以是數據,而且保存…

HashMap死鎖原因及替代方案

原文鏈接:http://blog.csdn.net/fhzaitian/article/details/51505516 ------------------------------------------------------------------------1、首先我們需要簡單地了解一下HashMap數據結構 HashMap通常會用一個指針數組(假設為table[]&#xff09…

優化mysql數據庫_MySQL數據庫十大優化技巧

WEB開發者不光要解決程序的效率問題,對數據庫的快速訪問和相應也是一個大問題。希望本文能對大家掌握MySQL優化技巧有所幫助。1. 優化你的MySQL查詢緩存在MySQL服務器上進行查詢,可以啟用高速查詢緩存。讓數據庫引擎在后臺悄悄的處理是提高性能的最有效方…

跋山涉水——深入 Redis 字典遍歷

Redis 字典的遍歷過程邏輯比較復雜,互聯網上對這一塊的分析講解非常少。我也花了不少時間對源碼的細節進行了整理,將我個人對字典遍歷邏輯的理解呈現給各位讀者。也許讀者們對字典的遍歷過程有比我更好的理解,還請不吝指教。一邊遍歷一邊修改…

linux下VI模式中上下左右鍵和回退鍵出現字母

原文地址:http://blog.csdn.net/u012860950/article/details/50127779 ---------------------------------------------------------------- 1.編輯/etc/vim/vimrc.tiny 由于/etc/vim/vimrc.tiny的擁有者是root用戶,所以要在root的權限下對這個文件進行修…

mysql數據庫查詢優化建議_mysql數據庫查詢優化的24條建議

MySQL是一個強大的開源數據庫。隨著MySQL上的應用越來越多,MySQL逐漸遇到了瓶頸。這里提供一些關于Mysql 數據庫查詢優化的24條優化建議,僅供參考。Mysql 查詢優化1、使用慢查詢日志,找出執行慢的查詢。2、使用 EXPLAIN 來決定查詢功能是否合…

常規sql讀取CLOB

plsql下,普通sqlsql-cmd下總結: 常規的sql,查詢clob字段,只能顯示部分內容。 查clob內容select dbms_lob.substr(c_content) from table_content t dbms_lob.substr將大文本轉換字符類型讀出來.dbms_lob.substr的轉換對字段conten…

精解 ES6箭頭函數

🐱 個人主頁:SHOW科技,公眾號:SHOW科技 🙋?♂? 作者簡介:2020參加工作,專注于前端各領域技術,共同學習共同進步,一起加油呀! 💫優質專欄&#x…

硬盤主引導記錄詳解

說明:硬盤主引導記錄獨立于操作系統,但又和操作系統息息相關——很多時候它又是由; 操作系統所提供的工具所生成(例外的情況是您使用了其他的分區工具,不過它又運行在; 什么操作系統中呢?;()。;; 如果您安裝…

Oracle char varchar varchar2 nvarchar2 的區別

上面字符類型能保存多少個字符與oracle當前的字符集有關系。 select userenv(language) from dual; 假設長度2000字節, 如果字符集是16位編碼的,ZHS16GBK,那么每個字符16位,2字節,所以可以容納1000字符。 如果是32位編…

樹莓派lnmp安裝mysql_在樹莓派上安裝 LNMP

樹莓派支持安裝非常多的操作系統,如官方所展示:這里我選擇了推薦的 Raspbian 系統,它基于 Debian,這就意味著我可以按照 Debian 的方式來安裝軟件。一、安裝 Nginx0、先將系統更新到最新狀態$ sudo apt-get update && sud…

openlayers5之熱力圖heatmap

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/gisdoer/article/details/81745645 openlayers5之熱力圖 點擊查看文章

maven項目在打war包時出現非法字符: '\ufeff' 解決方案

http://blog.csdn.net/qi_fei/article/details/61416319 --------------------------------------------問題描述: 開發工具MyEclipse 的總體開發環境,編碼格式總體設置為UTF-8,在將web項目打包的時候出現:非法字符:\u…

0027-生成圓

題目 生成圓難度級別:A; 運行時間限制:1000ms; 運行空間限制:51200KB; 代碼長度限制:2000000B 試題描述給你一些特殊的圓,每個這樣的圓每秒可以產生一個普通的圓,如果給你…

mysql啟多_MySQL啟多個實例

很多朋友都想在一臺服務器上運行多個MySQL Instance,究竟怎么做呢?首先要明晰幾個原理, 簡稱為mysqld讀取my.cnf的順序:第一搜,首先讀取/etc/my.cnf,多實例這個配置文件不會存在。:-(第二搜&…

數據連接池druid 和 大數據框架druid

叫druid的有兩個開源項目。 一個是:Druid是一個JDBC組件,它包括三部分: DruidDriver 代理Driver,能夠提供基于Filter-Chain模式的插件體系。 DruidDataSource 高效可管理的數據庫連接池。 SQLParser 另一個是&#xff…

零基礎入門深度學習(5) - 循環神經網絡

往期回顧 在前面的文章系列文章中,我們介紹了全連接神經網絡和卷積神經網絡,以及它們的訓練和使用。他們都只能單獨的取處理一個個的輸入,前一個輸入和后一個輸入是完全沒有關系的。但是,某些任務需要能夠更好的處理序列的信息&am…

sql排名名次分頁mysql_mysql 實現排名及中文排序實例[分頁累加行號]

/*排名相同情況下,優先按姓名排序*/SELECT t.name, t.company_name, rownum:rownum1 as rankNum, t.ss from (SELECT u.name, sci.company_name, rownum:0,(u.check_numu.online_hours) as ss FROM v_user uLEFT JOIN sys_company_info sci ON u.companyId sci.com…

世上最簡單的mysql_史上最簡單安裝MySQL教程

1.安裝MySQL很多都推薦在MySQL官網進行安裝,我剛開始試的時候官網下載zip文件,打開完全找不到,踩坑了后面我發現了Windows簡易安裝,俗稱傻子都會安裝安裝好了就會看到一個這個文件安裝之前首先你的有沒有這個你就無法安裝,這個可以去這里進行下載安裝好了就可以安裝MySQL了因為…

linux下ftp配置文件詳解

# 匿名用戶配置 anonymous_enableYES # 是否允許匿名ftp,如否則選擇NO anon_upload_enableYES # 匿名用戶是否能上傳 anon_mkdir_write_enableYES # 匿名用戶是否能創建目錄 anon_other_write_enableYES # 修改文件名和刪除文件 # 本地用戶配置 …