[精讚] [會員登入]
13174

[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

你可能感興趣的文章

[phpmyadmin] 登錄超時 (1440 秒未操作),請重新登錄 phpmyadmin登錄超時 (1440 秒未操作),請重新登錄的問題,該如何解決?

[MySQL/Mariadb] 正規表達式(regular express) mysql的正規表達式很詭異,很不能接受

Mysql INSERT ... ON DUPLICATE KEY UPDATE 寫法,MYSQL如果存在的修改,不存在就新增的寫法 Mysql有則修改,無則新增的sql寫法

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

[Mysql] 建立叢集式資料庫2/4 -- DB2、DB3設定 使用galera建立Mysql的叢集式資料庫 ,繼續建立第2,第3台DBs

[Mysql] 將記錄由0變1、1變0;或是判斷後再改值的寫法 MySQL 將記錄由0變1,1變0的SQL寫法 假如欄位 `active` 為0 是失效;1 為有效,他的型態是 tin

我有話要說

>>

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

訪客留言

[無留言]

隨機好文

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

為什麼要買長達二十年的保單? 為什麼要買長達二十年的保單?找一個可以說服我買二十年保單的理由。

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

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

[JAVA] JWS, JWT, JWE, JOSE是什麼? [JAVA] JWS, JWT, JWE, JOSE是什麼?非常的複雜,儘量來搞清楚..