MySQL存儲函數(shù)以及觸發(fā)器詳解
MySQL
MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關系數(shù)據(jù)庫管理系統(tǒng)) 應用軟件之一。MySQL是一種關系型數(shù)據(jù)庫管理系統(tǒng),關系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL 軟件采用了雙授權政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型和大型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫。
SQL
結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種數(shù)據(jù)庫查詢和程序設計語言,用于存取數(shù)據(jù)以及查詢、更新和管理關系數(shù)據(jù)庫系統(tǒng)。結構化查詢語言是高級的非過程化編程語言,允許用戶在高層數(shù)據(jù)結構上工作。它不要求用戶指定對數(shù)據(jù)的存放方法,也不需要用戶了解具體的數(shù)據(jù)存放方式,所以具有完全不同底層結構的不同數(shù)據(jù)庫系統(tǒng), 可以使用相同的結構化查詢語言作為數(shù)據(jù)輸入與管理的接口。結構化查詢語言語句可以嵌套,這使它具有極大的靈活性和強大的功能。
存儲函數(shù)
1). 介紹
存儲函數(shù)是有返回值的存儲過程,存儲函數(shù)的參數(shù)只能是 IN 類型的。具體語法如下:
CREATE FUNCTION 存儲函數(shù)名稱 ([ 參數(shù)列表 ]) RETURNS type [characteristic ...] BEGIN -- SQL語句 RETURN ...; END ;
characteristic 說明
DETERMINISTIC :相同的輸入?yún)?shù)總是產(chǎn)生相同的結果
NO SQL :不包含 SQL 語句。
READS SQL DATA :包含讀取數(shù)據(jù)的語句,但不包含寫入數(shù)據(jù)的語句。
2). 案例
計算從 1 累加到 n 的值, n 為傳入的參數(shù)值。
create function fun1(n int) returns int deterministic begin declare total int default 0; while n>0 do set total := total + n; set n := n - 1; end while; return total; end; select fun1(50);
在 mysql8.0 版本中 binlog 默認是開啟的,一旦開啟了, mysql 就要求在定義存儲過程時,需要指定
characteristic 特性,否則就會報如下錯誤:
觸發(fā)器
介紹
觸發(fā)器是與表有關的數(shù)據(jù)庫對象,指在 insert/update/delete 之前 (BEFORE) 或之后 (AFTER) ,觸發(fā)并執(zhí)行觸發(fā)器中定義的 SQL 語句集合。觸發(fā)器的這種特性可以協(xié)助應用在數(shù)據(jù)庫端確保數(shù)據(jù)的完整性, 日志記錄 , 數(shù)據(jù)校驗等操作 。
使用別名 OLD 和 NEW 來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,這與其他的數(shù)據(jù)庫是相似的。現(xiàn)在觸發(fā)器還只支持行級觸發(fā),不支持語句級觸發(fā)。
語法
1). 創(chuàng)建
CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE/DELETE ON tbl_name FOR EACH ROW -- 行級觸發(fā)器 BEGIN trigger_stmt ; END;
2). 查看
SHOW TRIGGERS ;
3). 刪除
DROP TRIGGER [schema_name.]trigger_name ; -- 如果沒有指定 schema_name,默認為當前數(shù) 據(jù)庫 。
案例
通過觸發(fā)器記錄 tb_user 表的數(shù)據(jù)變更日志,將變更日志插入到日志表 user_logs 中 , 包含增加 ,
修改 , 刪除 ;
表結構準備 :
-- 準備工作 : 日志表 user_logs create table user_logs( id int(11) not null auto_increment, operation varchar(20) not null comment '操作類型, insert/update/delete', operate_time datetime not null comment '操作時間', operate_id int(11) not null comment '操作的ID', operate_params varchar(500) comment '操作參數(shù)', primary key(`id`) )engine=innodb default charset=utf8;
A. 插入數(shù)據(jù)觸發(fā)器
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('插入的數(shù)據(jù)內(nèi)容為: id=',new.id,',name=',new.name, ', phone=', NEW.phone, ', email=', NEW.email, ', profession=', NEW.profession)); end;
測試:
-- 查看 show triggers ; -- 插入數(shù)據(jù)到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());
測試完畢之后,檢查日志表中的數(shù)據(jù)是否可以正常插入,以及插入數(shù)據(jù)的正確性。
B. 修改數(shù)據(jù)觸發(fā)器
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('更新之前的數(shù)據(jù): id=',old.id,',name=',old.name, ', phone=', old.phone, ', email=', old.email, ', profession=', old.profession, ' | 更新之后的數(shù)據(jù): 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;
測試完畢之后,檢查日志表中的數(shù)據(jù)是否可以正常插入,以及插入數(shù)據(jù)的正確性。
C. 刪除數(shù)據(jù)觸發(fā)器
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('刪除之前的數(shù)據(jù): id=',old.id,',name=',old.name, ', phone=', old.phone, ', email=', old.email, ', profession=', old.profession)); end;
測試:
-- 查看 show triggers ; -- 刪除數(shù)據(jù) delete from tb_user where id = 26;
測試完畢之后,檢查日志表中的數(shù)據(jù)是否可以正常插入,以及插入數(shù)據(jù)的正確性。
到此這篇關于MySQL存儲函數(shù)以及觸發(fā)器詳解的文章就介紹到這了,更多相關MySQL存儲函數(shù)及觸發(fā)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- MySQL觸發(fā)器Trigger加載及目前局限性
- 一文教你如何使用MySQL觸發(fā)器
- 淺談MySQL觸發(fā)器的原理以及使用
- MySQL中的觸發(fā)器trigger用法解析
- MySQL如何創(chuàng)建觸發(fā)器(CREATE TRIGGER)
- Mysql觸發(fā)器字段雙向更新方式
- mysql觸發(fā)器中監(jiān)控字段的改變方式
- mysql觸發(fā)器同步表的數(shù)據(jù)方式
- MySQL觸發(fā)器實現(xiàn)兩表數(shù)據(jù)同步的代碼詳解
- MySQL使用觸發(fā)器實現(xiàn)數(shù)據(jù)自動更新的應用實例
- 從零開始MySQL觸發(fā)器實戰(zhàn)攻略
- MySQL 觸發(fā)器(TRIGGER)的具體使用
相關文章
MySQL中復制數(shù)據(jù)表中的數(shù)據(jù)到新表中的操作教程
這篇文章主要介紹了MySQL中復制數(shù)據(jù)表中的數(shù)據(jù)到新表中的操作教程,文中分為新表存在和新表不存在兩種情況來講,需要的朋友可以參考下2016-03-03mysql5.7.18.zip免安裝版本配置教程(windows)
這篇文章主要為大家詳細介紹了mysql5.7.18.zip安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05MySQL深分頁,limit 100000,10優(yōu)化方式
MySQL中深分頁查詢因需掃描大量數(shù)據(jù)行導致效率低下,優(yōu)化方法包括子查詢優(yōu)化、延遲關聯(lián)、標簽記錄法和使用between...and...等,通過減少回表次數(shù)和范圍掃描提升查詢性能,覆蓋索引幫助減少搜索次數(shù),提升性能2024-10-10MySQL 日期時間格式化函數(shù) DATE_FORMAT() 的使用示例詳解
`DATE_FORMAT()`是MySQL中用于格式化日期時間的函數(shù),本文詳細介紹了其語法、格式化字符串的含義以及常見日期時間格式組合,感興趣的朋友一起看看吧2025-03-03