MySQL中創建觸發器需要執行哪些操作?
什么是觸發器
觸發器,就是一種特殊的存儲過程。觸發器和存儲過程一樣是一個能夠完成特定功能、存儲在數據庫服務器上的SQL片段,但是觸發器無需調用,當對數據庫表中的數據執行DML操作時自動觸發這個SQL片段的執行,無需手動調用。觸發器的這種特性可以協助應用在數據庫端確保數據的完整性 , 日志記錄 , 數據校驗等操作 。在MySQL中,只有執行insert,delete,update操作時才能觸發觸發器的執行。
使用別名 OLD 和 NEW 來引用觸發器中發生變化的記錄內容,這與其他的數據庫是相似的。現在觸發器還只支持行級觸發,不支持語句級觸發。
創建觸發器
創建只有一個執行語句的觸發器,具體代碼如下:
create trigger 觸發器名 before|after 觸發事件
on 表名 for each row
執行語句;
創建有多個執行語句的觸發器的具體代碼如下:
create trigger 觸發器名 before|after 觸發事件
on 表名 for each row
begin
執行語句列表
end;
-- 數據準備
create database if not exists mydb10_trigger;
use mydb10_trigger;
-- 用戶表
create table user(
uid int primary key ,
username varchar(50) not null,
password varchar(50) not null
);
-- 用戶信息操作日志表
create table user_logs(
id int primary key auto_increment,
time timestamp,
log_text varchar(255)
);
-- 如果觸發器存在,則先刪除
drop trigger if exists trigger_test1;
-- 創建觸發器trigger_test1
create trigger trigger_test1
after insert on user -- 觸發時機:當添加user表數據時觸發
for each row
insert into user_logs values(NULL,now(), '有新用戶注冊');
-- 添加數據,觸發器自動執行并添加日志代碼
insert into user values(1,'張三','123456');
-- 如果觸發器trigger_test2存在,則先刪除
drop trigger if exists trigger_test2;
-- 創建觸發器trigger_test2
delimiter $$
create trigger trigger_test2
after update on user -- 觸發時機:當修改user表數據時觸發
for each row -- 每一行
begin
insert into user_logs values(NULL,now(), '用戶修改發生了修改');
end $$
delimiter ;
-- 添加數據,觸發器自動執行并添加日志代碼
update user set password = '888888' where uid = 1;
操作-NEW與OLD
MySQL 中定義了 NEW 和 OLD,用來表示觸發器的所在表中,觸發了觸發器的那一行數據,來引用觸發器中發生變化的記錄內容,具體地:
使用方法:NEW.columnName (columnName為相應數據表某一列名)示例代碼如下:
create trigger trigger_test3 after insert
on user for each row
insert into user_logs values(NULL,now(),concat('有新用戶添加,信息為:',NEW.uid,NEW.username,NEW.password));
-- 測試
insert into user values(4,'趙六','123456');
查看觸發器可以使用入下代碼:
show triggers;
刪除觸發器可以使用入下代碼:
-- drop trigger [if exists] trigger_name
drop trigger if exists trigger_test1;
注意:
1.MYSQL中觸發器中不能對本表進行 insert ,update ,delete 操作,以免遞歸循環觸發。
2.盡量少使用觸發器,假設觸發器觸發每次執行1s,insert table 500條數據,那么就需要觸發500次觸發器,光是觸發器執行的時間就花費了500s,而insert 500條數據一共是1s,那么這個insert的效率就非常低了。
3. 觸發器是針對每一行的;對增刪改非常頻繁的表上切記不要使用觸發器,因為它會非常消耗資源。