教育行業A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

觸發器是什么?MySQL里該怎么使用觸發器?

更新時間:2022年10月31日17時52分 來源:傳智教育 瀏覽次數:

什么是觸發器

觸發器,就是一種特殊的存儲過程。觸發器和存儲過程一樣是一個能夠完成特定功能、存儲在數據庫服務器上的SQL片段,但是觸發器無需調用,當對數據庫表中的數據執行DML操作時自動觸發這個SQL片段的執行,無需手動調用。觸發器的這種特性可以協助應用在數據庫端確保數據的完整性 , 日志記錄 , 數據校驗等操作 。在MySQL中,只有執行insert,delete,update操作時才能觸發觸發器的執行。

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

什么是觸發器

創建觸發器

創建只有一個執行語句的觸發器,具體代碼如下:

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,用來表示觸發器的所在表中,觸發了觸發器的那一行數據,來引用觸發器中發生變化的記錄內容,具體地:

1667208206301_觸發器.png

使用方法: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. 觸發器是針對每一行的;對增刪改非常頻繁的表上切記不要使用觸發器,因為它會非常消耗資源。

0 分享到:
精品人妻av区