[精讚] [會員登入]
13023

[Mysql] Trigger 觸發使用方法

trigger 在資料庫的使用上,具有極大的方便性,該如何使用?

分享此文連結 //n.sfs.tw/10448

分享連結 [Mysql] Trigger 觸發使用方法@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-11-07 01:19:32 最後編修
2016-12-18 23:10:53 By 張○○
 

自動目錄

trigger 在資料庫的使用上,具有極大的方便性。MySQL 在5.02 後支援了 trigger 的指令。

建立 trigger

CREATE TRIGGER trigger_name trigger_time trigger_event  ON tbl_name FOR EACH ROW trigger_stmt

trigger_name 觸發名稱,隨便取名

trigger_time 觸發時間 ,只有 BEFORE 和AFTER兩種。BEFORE 是在進行trigger_event 之前,AFTER 在進行trigger_event 之後觸發

trigger_event 觸發事件,有 INSERT、DELETE、UPDATE 三種。以下有幾個注意點:

1. INSERT INTO .. ON DUPLICATE UPDATE 這語法造成的觸發行為由最後是 INSERT 或是 UPDATE 來決定
2. 同一個 trigger_time +trigger_event  組合不得重覆。
3. INSERT、LOAD DATA和REPLACE 都會觸發 INSERT event;DELETE和REPLACE 都會觸發 DELETE。

trigger_stmt 是當觸發時要執行的語句。如果您打算執行多個語句,可使用BEGIN ... END復合語句結構。以下是範例(直接在Mysql console下指令,不要phpMyAdmin下操作):

DELIMITER |  (這裡很重要,如果不修改預設的 ;,則後面會出錯)

CREATE TRIGGER `insertrow` BEFORE INSERT ON `logs`

  FOR EACH ROW BEGIN

    UPDATE `summary` SET `value` = `value` +1 WHERE `ky` = 'rownum';

  END

|

DELIMITER ; (把結束符號修改回去)

查看trigger 內容

mysql> show triggers;
+-----------+--------+-------+----------------------------------------------------------------------------
| Trigger   | Event  | Table | Statement
+-----------+--------+-------+---------------------------------------------------------------------------- 
| insertrow | INSERT | logs  | BEGIN UPDATE `summary` SET `value` = `value` +1 WHERE `ky` = 'rownum'; END
+-----------+--------+-------+---------------------------------------------------------------------------- 

+--------+---------+----------+----------------+
| Timing | Created | sql_mode | Definer        |
+--------+---------+----------+----------------+
| BEFORE | NULL    |          | axer@localhost |
+--------+---------+----------+----------------+

刪除trigger

mysql> drop TRIGGER insertrow;

範例:

在刪除記錄時,把資料行備份到另一個資料表

mysql> DELIMITER $$

mysql> CREATE TRIGGER TR_A_DEL_INNMSGREPLY_TABLE AFTER DELETE ON source_tbl FOR EACH ROW BEGIN INSERT IGNORE INTO target_tbl( sn, fsn, author, o, `desc`,cDT ) VALUES ( old.sn, old.fsn, old.author, old.o, old.desc, old.cDT); END$$

mysql> DELIMITER ;

再次提醒,不要phpMyAdmin下操作,你不會成功。

2016.1.23更新

在phpmyadmin4版後可以直接操作了,有一個觸發器,選擇資料庫後有一個「觸發器的頁籤,可以直接設定

各位可以試試

參考資料

[1] Mysql 5.1 doc 中文 http://twpug.net/docs/mysql-5.1/triggers.html

[2] http://stackoverflow.com/questions/1939364/is-it-possible-to-move-a-record-from-one-table-to-another-using-a-single-sql-sta


原文 2010-09-10 15:12:12

END

你可能感興趣的文章

[Mysql/Mariadb] GROUP_CONCAT 函數 MySQL 中和 group by 一起用的函式,如果我們要算數值的總和或平均,可以使用 sum() 或 avg() 。但是我們如果要在 group by 中把字串「黏起來」,不是使用 concat(

[Mysql] 修改資料庫預設校對或編碼 修改資料庫預設校對或編碼的方法

[Mysql] 建立叢集式資料庫1/4 -- 安裝及設定DB1 使用galera建立Mysql的叢集式資料庫 (GALERA CLUSTER FOR MYSQL THE TRUE MULTI-MASTER)

[Mysql/Mariadb] 查看使用狀態,抓出可疑慢查詢SQL 當Mysql 的負載loading飆高時,除了重新啟動外,如果想對症下藥,那該怎麼處理?

Mysql INSERT ... ON DUPLICATE KEY UPDATE 寫法 Mysql有則修改,無則新增的sql寫法

[Mysql/Mariadb] 忘記root密碼 常常會忘記root 密碼,簡單的幾步驟回復

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[jQuery] 利用load()來達成ajax的寫法 jQuery中利用load()來達成ajax的寫法,也有人稱他是假的ajax,作法就是..

[Freebsd] 使用 ADSL 撥接上網 Freebsd上要使用 ADSL 撥接上網,該如何設定?

[札記] 2016.7~12月札記 札記,只是札記

為什麼要重造輪子? 什麼輪子?造什麼輪子?我為什麼要重造輪子?

[PHP] 檢查檔案是否是圖檔 使用getimagesize函數檢查檔案是否是圖檔