首頁 > 軟體

MySQL觸發器自動智慧化的資料維護

2022-07-11 18:04:16

觸發器介紹

觸發器,就是一種特殊的儲存過程。觸發器和儲存過程一樣是一個能夠完成特定功能、儲存在資料庫伺服器上的SQL片段,但是觸發器無需呼叫,當對資料庫表中的資料執行DML操作時自動觸發這個SQL片段的執行,無需手動條用。

在MySQL中,只有執行insert,delete,update操作時才能觸發觸發器的執行

觸發器的這種特性可以協助應用在資料庫端確保資料的完整性 , 紀錄檔記錄 , 資料校驗等操作 

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

觸發器的特性

  • 1、什麼條件會觸發:I、D、U
  • 2、什麼時候觸發:在增刪改前或者後
  • 3、觸發頻率:針對每一行執行
  • 4、觸發器定義在表上,附著在表上

觸發器語法

1、建立只有一個執行語句的觸發器

create trigger 觸發器名 before|after 觸發事件
on 表名 for each row
執行語句;

2、建立有多個執行語句的觸發器

create trigger 觸發器名 before|after 觸發事件
on 表名 for each row
begin
執行語句列表
end;

資料準備

-- 資料準備
create database if not exists db_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');

從上面的語法我們可以知道,觸發器的基本的結構是怎樣的

create trigger 觸發器名稱 after(before)insert(update,delete)on 表名(監控表) for each row 執行語句

觸發器——執行多個觸發語句

-- 如果觸發器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;

這裡,採用了標準的格式進行觸發器的語法格式,可以定義多個執行語句,將所有的執行語句寫在begin end $$裡面,也就是需要採用這樣的方式包裹住。

delimiter $$ create trigger 觸發器名稱 after(before)insert(update,delete)on 表名 for each row  begin 執行語句 end $$ delimiter;

也就是說我們將出發語句,放在了begin 和 end $$ 中間

New Old 操作

MySQL 中定義了 NEW 和 OLD,用來表示觸發器的所在表中,觸發了觸發器的那一行資料,來參照觸發器中發生變化的記錄內容,具體地:

觸發器型別

 

 

觸發器型別NEW 和 OLD的使用

 

 

INSERT 型觸發器

 

 

NEW 表示將要或者已經新增的資料

 

 

UPDATE 型觸發器

 

 

OLD 表示修改之前的資料 , NEW 表示將要或已經修改後的資料

 

 

DELETE 型觸發器

 

 

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

總結

既然,在MySQL內部建立觸發器,會使得表的執行效率大大降低,我們又如何去監控我們的表運算元據呢?答案是,我們可以使用後臺程式碼,比如python、java,通過連線資料庫,實現對資料的行為進行監控,達到我們紀錄檔的監控(表的操作)。

舉一個簡單的例子,目前某學校使用的教務管理系統是採用傳統的資料庫——mysql,現在老師將學生的成績統一上傳到了後臺,但是發現有一位同學的成績出現了錯誤,於是它就修改了該同學的資料,這個時候專門的記錄操作的表就會記錄下該老師的操作行為。

到此這篇關於MySQL觸發器自動智慧化的資料維護的文章就介紹到這了,更多相關MySQL觸發器 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com