觸發器是一種特殊的存儲過程,不像存儲過程須要顯示調用,觸發器經過監控表事件(增刪改操做)自動觸發某條 sql 的執行,能夠用於購物車加購後庫存減小等場景。mysql
DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ TRIGGER `dbname`.`trigger` BEFORE/AFTER INSERT/UPDATE/DELETE ON `dbname`.`<Table Name>` FOR EACH ROW BEGIN -- 觸發的 sql 動做 END$$ DELIMITER ;
觸發事件類型 | new/old使用 |
---|---|
INSERT事件 | 沒有 old,只有 new,new 表示將要(插入前)或者已經增長(插入後)的數據 |
UPDATE事件 | 既有 old 也有 new,old 表示更新以前的數據,new 表示更新以後的數據 |
DELETE事件 | 沒有 new,只有 old,old 表示將要(刪除前)或者已經被刪除(刪除後)的數據 |
SQL 語句:web
SHOW TRIGGERS;
觸發器不能修改,只能刪除,刪除 sql 語句:sql
DROP TRIGGER triggerName;
觸發器事件跟觸發器中的 SQL 語句是原子性的(要麼同時執行,要麼同時不執行),這樣保證了數據的完整性。數據庫
1)只適合用於併發不高的管理系統中用,若是是面向用戶的高併發應用,則不能使用,由於大部分的 web 應用瓶頸都在 DB,把耗時的服務作成 Scale Out,這種狀況下,確定不會使用存儲過程;而若是隻是通常的應用,DB 沒有性能上的問題,在適當的場景下,也可使用存儲過程。
2)存儲過程的致命傷在於移植性,存儲過程不能跨庫移植,好比事先是在mysql數據庫的存儲過程,考慮性能要移植到oracle上面那麼全部的存儲過程都須要被重寫一遍。
3)觸發器不推薦使用,難以開發和維護,且能夠被事務代替,觸發操做能在業務層解決就在業務層解決,不然很難維護,並且容易產生死鎖。併發