1. 程式人生 > >mysql 觸發器-監控表字段更新

mysql 觸發器-監控表字段更新

emp ble mysql觸發器 sda 一個 記錄 觸發器 ldm rom

  最近想實現一個監控mysql表的某個或者某幾個字段值的變化,當監控字段的值發生變化時,將原有值和更新值保存下來。想實現這個功能受限想到的就是觸發器,mysql的觸發器塊很久沒碰過了,重新拎起來還是免不了查些資料什麽的。花了點時間搞定了這個觸發器。這裏寫個小例子來記錄下mysql觸發器編寫的過程。

mysql觸發器格式如下:

CREATE TRIGGER 觸發器名 觸發器時間 觸發事件
ON 表名 FOR EACH ROW
BEGIN
    執行語句
END
註:觸發器名 - 觸發器的名稱
  觸發器時間 - 觸發器觸發的時機,值為 BEFOREAFTER
  觸發器事件 - 引起觸發器觸發的事件,值為INSERT
UPDATEDELETE
  表名 - 觸發觸發器的表名,即該觸發器是建立在那張表上面的
  執行語句 - 即為觸發器出發後執行的操作

案例:監控表tp_temp的mobile字段,當mobile字段發生變化時,tp_temp_2建立更新記錄 : 將更新前的mobile值和更新後的mobile值記錄到tp_temp_2表的mobile1和mobile2中

tp_temp表:

CREATE TABLE `tp_temp` (
`list_id` varchar(100) NOT NULL COMMENT ‘手機號‘,
`mobile` varchar(40) DEFAULT NULL COMMENT ‘ID‘
)

tp_temp2表:

CREATE TABLE `tp_temp_2` (
`list_id` varchar(100) DEFAULT NULL COMMENT ‘ID‘,
`mobile1` varchar(40) DEFAULT NULL COMMENT ‘手機號1‘,
`mobile2` varchar(40) NOT NULL COMMENT ‘手機號2‘,
`create_time` datetime DEFAULT NULL COMMENT ‘創建時間‘
)

創建觸發器trigger_test:

DELIMITER $$

CREATE
TRIGGER `mydb`.`trigger_test

` BEFORE UPDATE -- mydb為數據庫名
ON `mydb`.`tp_temp`
FOR EACH ROW BEGIN
SET @oldMobile = (SELECT c.mobile FROM tp_temp c WHERE c.list_id=new.list_id LIMIT 1);
IF new.mobile <> @oldMobile THEN
INSERT INTO tp_temp2(list_id,mobile1,mobile2,create_time)VALUE (new.list_id,@oldMobile,new.mobile,SYSDATE());

END IF;
END$$

DELIMITER ;

以上。

mysql 觸發器-監控表字段更新