mysql觸發器

pine1203發表於2024-05-14

1. 介紹

  觸發器是與表有關的資料庫物件,指在 insert / update / delete之前(BEFORE) 或之後(AFTER),觸發並執行觸發器中定義的SQL語句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性, 日誌記錄 , 資料校驗等操作 。

  使用別名 OLD 和 NEW 來引用觸發器中發生變化的記錄內容,這與其他的資料庫是相似的。現在觸發器還只支援行級觸發,不支援語句級觸發。


2. 語法

  • 建立
CREATE TRIGGER trigger_name

BEFORE/AFTER INSERT/UPDATE/DELETE

ON tbl_name FOR EACH ROW -- 行級觸發器

BEGIN
  trigger_stmt ;
END;
  • 檢視
SHOW TRIGGERS ;
  • 刪除
DROP TRIGGER [schema_name.]trigger_name ; 
-- 如果沒有指定 schema_name,預設為當前資料庫 。

3. 案例

  透過觸發器記錄 tb_user 表的資料變更日誌,將變更日誌插入到日誌表 user_logs 中, 包含增加, 修改 , 刪除 ;

  1. 插入資料觸發器
create trigger tb_user_insert_trigger
  after insert on tb_user for each row

begin
  insert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
  (null, 'insert', now(), new.id, concat('插入的資料內容為:
id=',new.id,',name=',new.name, ', phone=', NEW.phone, ', email=', NEW.email, ',
profession=', NEW.profession));
end;


 測試:

-- 檢視

show triggers ;

-- 插入資料到tb_user

insert into tb_user(id, name, phone, email, profession, age, gender, status,
createtime) VALUES (26,'三皇子','18809091212','erhuangzi@163.com','軟體工
程',23,'1','1',now());

測試完畢之後,檢查日誌表中的資料是否可以正常插入,以及插入資料的正確性。

  1. 修改資料觸發器
create trigger tb_user_update_trigger
after update on tb_user for each row

begin
  insert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
(null, 'update', now(), new.id,
concat('更新之前的資料: id=',old.id,',name=',old.name, ', phone=',
old.phone, ', email=', old.email, ', profession=', old.profession,
' | 更新之後的資料: id=',new.id,',name=',new.name, ', phone=',
NEW.phone, ', email=', NEW.email, ', profession=', NEW.profession));
end;


 測試:

-- 檢視

show triggers ;

-- 更新

update tb_user set profession = '會計' where id = 23;

update tb_user set profession = '會計' where id <= 5;

測試完畢之後,檢查日誌表中的資料是否可以正常插入,以及插入資料的正確性。

  1. 刪除資料觸發器
create trigger tb_user_delete_trigger
after delete on tb_user for each row

begin
  insert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
  (null, 'delete', now(), old.id,
concat('刪除之前的資料: id=',old.id,',name=',old.name, ', phone=',
old.phone, ', email=', old.email, ', profession=', old.profession));
end;


 測試:

-- 檢視

show triggers ;

-- 刪除資料

delete from tb_user where id = 26;

測試完畢之後,檢查日誌表中的資料是否可以正常插入,以及插入資料的正確性。

相關文章