Numpy基礎學習筆記2020.12.28
對觸發器的支援是在MySQL 5中增加的。
建立觸發器
在建立觸發器時,需要給出4條資訊:
❑ 唯一的觸發器名;
❑ 觸發器關聯的表;
❑ 觸發器應該響應的活動(DELETE、INSERT或UPDATE);
❑ 觸發器何時執行(處理之前或之後)。
觸發器按每個表每個事件每次地定義,每個表每個事件每次只允許一個觸發器。因此,每個表最多支援6個觸發器(每條INSERT、UPDATE和DELETE的之前和之後)。單一觸發器不能與多個事件或多個表關聯,所以,如果你需要一個對INSERT和UPDATE操作執行的觸發器,則應該定義兩個觸發器。
INSERT觸發器
❑ 在INSERT觸發器程式碼內,可引用一個名為NEW的虛擬表,訪問被插入的行;
❑ 在BEFORE INSERT觸發器中,NEW中的值也可以被更新(允許更改被插入的值);
❑ 對於AUTO_INCREMENT列,NEW在INSERT執行之前包含0,在INSERT執行之後包含新的自動生成值。
DROP TRIGGER IF EXISTS neworder; CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW BEGIN SELECT NEW.order_num into @p1; END
CREATE TRIGGER用來建立名為neworder的新觸發器。觸發器可在一個操作發生之前或之後執行,這裡給出了AFTER INSERT,所以此觸發器將在INSERT語句成功執行後執行。這個觸發器還指定FOR EACH ROW,因此程式碼對每個插入行執行。
INSERT INTO `demo`.`orders` (`order_date`, `cust_id`) VALUES (NOW(), '1'); SELECT @p1;
DELETE觸發器
❑ 在DELETE觸發器程式碼內,你可以引用一個名為OLD的虛擬表,訪問被刪除的行;
❑ OLD中的值全都是隻讀的,不能更新。
DROP TRIGGER IF EXISTS deleteorder; CREATE TRIGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW BEGIN INSERT INTO `demo`.`orders_old` (`order_num`,`order_date`,`cust_id`)VALUES (OLD.order_num,OLD.order_date,OLD.cust_id); END
在任意訂單被刪除前將執行此觸發器。它使用一條INSERT語句將OLD中的值(要被刪除的訂單)儲存到一個名為orders_old的存檔表中(為實際使用這個例子,你需要用與orders相同的列建立一個名為orders_old的表)。使用BEFORE DELETE觸發器的優點(相對於AFTER DELETE觸發器來說)為,如果由於某種原因,訂單不能存檔,DELETE本身將被放棄。
UPDATE觸發器
❑ 在UPDATE觸發器程式碼中,你可以引用一個名為OLD的虛擬表訪問以前(UPDATE語句前)的值,引用一個名為NEW的虛擬表訪問新更新的值;
❑ 在BEFORE UPDATE觸發器中,NEW中的值可能也被更新(允許更改將要用於UPDATE語句中的值);
❑ OLD中的值全都是隻讀的,不能更新。
DROP TRIGGER IF EXISTS updateorder; CREATE TRIGGER updateorder BEFORE UPDATE ON orders FOR EACH ROW BEGIN set NEW.cust_id = NEW.cust_id + 1; END
關於觸發器的進一步介紹
❑ 與其他DBMS相比,MySQL 5中支援的觸發器相當初級。未來的MySQL版本中有一些改進和增強觸發器支援的計劃。
❑ 建立觸發器可能需要特殊的安全訪問許可權,但是,觸發器的執行是自動的。如果INSERT、UPDATE或DELETE語句能夠執行,則相關的觸發器也能執行。
❑ 應該用觸發器來保證資料的一致性(大小寫、格式等)。在觸發器中執行這種型別的處理的優點是它總是進行這種處理,而且是透明地進行,與客戶機應用無關。
❑ 觸發器的一種非常有意義的使用是建立審計跟蹤。使用觸發器,把更改(如果需要,甚至還有之前和之後的狀態)記錄到另一個表非常容易。
❑ 遺憾的是,MySQL觸發器中不支援CALL語句。這表示不能從觸發器內呼叫儲存過程。所需的儲存過程程式碼需要複製到觸發器內。
書籍:MySQL必知必會-第25章 使用觸發器