[精讚] [會員登入]
13622

[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] 修改欄位的自動索引值autoindex (auto_increment ) Mysql 新增、刪除、修改、查看欄位的自動索引值autoindex (auto_increment)

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

[Mysql/Mariadb] Left Join 和 Right Join 合併表單 SQL語法中的 Left Join 和 Right Join 很常用,但是我常會忘記,所以寫下來備忘。

[Mysql/Mariadb] 密碼設定強度修改 新的mysql對於密碼預設也把原來的規則改得更嚴格,此篇教你修改密碼的設定政策

[MySQL] console mode 的亂碼處理 使用MySQL的console mode如果出現亂碼 在,要怎麼處理?

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

隨機好文

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

談借錢 人借錢時手心向上頭向下,人還錢時手心向下頭向上

[HP DL380G7] 生效啟動第3,4片網卡/開啟或關閉內建的網卡 HP DL380G7 預設第3,4片網卡裝完系統後找不到,難道是壞了?要怎麼辦?

[Win7] 燒錄 iso 檔 在Windows7 中內建燒錄程式,可以直接把檔案拉到光碟機裡,再執行燒錄。

維修冰箱 維修冰箱