mysql-經常使用組件之觸發器

基本概念

觸發器是一種特殊的存儲過程,不像存儲過程須要顯示調用,觸發器經過監控表事件(增刪改操做)自動觸發某條 sql 的執行,能夠用於購物車加購後庫存減小等場景。mysql

觸發器基本操做

1. 建立觸發器

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 ;
  • 觸發時間:
    before:表中數據發生改變前的狀態
    after:表中數據發生改變後的狀態
    PS:若是 before 觸發器失敗或者語句自己失敗,將不執行 after 觸發器(若是有的話)
  • 觸發事件:
    INSERT
    DELETE
    UPDATE
  • old/new 關鍵字
    觸發器針對的是數據庫中的每一行記錄,每行數據在操做先後都會有一個對應的狀態,觸發器將沒有操做以前的狀態保存到 old 關鍵字中,將操做後的狀態保存到 new 中,不一樣類型的觸發事件擁有不一樣的關鍵字類型:
觸發事件類型 new/old使用
INSERT事件 沒有 old,只有 new,new 表示將要(插入前)或者已經增長(插入後)的數據
UPDATE事件 既有 old 也有 new,old 表示更新以前的數據,new 表示更新以後的數據
DELETE事件 沒有 new,只有 old,old 表示將要(刪除前)或者已經被刪除(刪除後)的數據

2. 查看觸發器

SQL 語句:web

SHOW TRIGGERS;

3. 刪除觸發器

觸發器不能修改,只能刪除,刪除 sql 語句:sql

DROP TRIGGER triggerName;

觸發器的優缺點

1. 優勢

觸發器事件跟觸發器中的 SQL 語句是原子性的(要麼同時執行,要麼同時不執行),這樣保證了數據的完整性。數據庫

2. 缺點

1)只適合用於併發不高的管理系統中用,若是是面向用戶的高併發應用,則不能使用,由於大部分的 web 應用瓶頸都在 DB,把耗時的服務作成 Scale Out,這種狀況下,確定不會使用存儲過程;而若是隻是通常的應用,DB 沒有性能上的問題,在適當的場景下,也可使用存儲過程。
2)存儲過程的致命傷在於移植性,存儲過程不能跨庫移植,好比事先是在mysql數據庫的存儲過程,考慮性能要移植到oracle上面那麼全部的存儲過程都須要被重寫一遍。
3)觸發器不推薦使用,難以開發和維護,且能夠被事務代替,觸發操做能在業務層解決就在業務層解決,不然很難維護,並且容易產生死鎖。併發

相關文章
相關標籤/搜索