MySql 游標(biāo)和觸發(fā)器概念及使用詳解
游標(biāo)
1.什么是游標(biāo)
MySQL游標(biāo)是一種數(shù)據(jù)庫對象,它用于在數(shù)據(jù)庫查詢過程中迭代訪問結(jié)果集中的每一行。游標(biāo)可以被看作是一個指向查詢結(jié)果集的指針,通過移動游標(biāo),可以按行讀取和處理結(jié)果集的數(shù)據(jù)。在MySQL中,游標(biāo)可以用于在存儲過程或函數(shù)中處理復(fù)雜的業(yè)務(wù)邏輯,例如逐行處理查詢結(jié)果、循環(huán)操作數(shù)據(jù)等。使用游標(biāo)可以讓我們更加靈活地處理結(jié)果集。
2.使用游標(biāo)的步驟
游標(biāo)必須在聲明處理程序之前被聲明,并且變量和條件還必須在聲明游標(biāo)或處理程序之前被聲明。如果我們想要使用游標(biāo),一般需要經(jīng)歷四個步驟。不同的 DBMS 中,使用游標(biāo)的語法可能略有不同
2.1 聲明游標(biāo)
使用DECLARE關(guān)鍵字來聲明游標(biāo),其語法的基本形式如下:
DECLARE cursor_name CURSOR FOR select_statement;
要使用 SELECT 語句來獲取數(shù)據(jù)結(jié)果集,而此時還沒有開始遍歷數(shù)據(jù),這里 select_statement 代表的是SELECT 語句,返回一個用于創(chuàng)建游標(biāo)的結(jié)果集。比如:
DECLARE cur_score CURSOR FOR SELECT stu_id,grade FROM score;
2.2 打開游標(biāo)
OPEN 游標(biāo)名稱 -- 例如 open cur_score;
2.3 使用游標(biāo)
這句的作用是使用 cursor_name 這個游標(biāo)來讀取當(dāng)前行,并且將數(shù)據(jù)保存到 var_name 這個變量中,游標(biāo)指針指到下一行。如果游標(biāo)讀取的數(shù)據(jù)行有多個列名,則在 INTO 關(guān)鍵字后面賦值給多個變量名即可。
注意:var_name必須在聲明游標(biāo)之前就定義好.
FETCH cursor_name INTO var_name [, var_name] ... FETCH cur_score INTO stu_id, grade ;
注意:游標(biāo)的查詢結(jié)果集中的字段數(shù),必須跟 INTO 后面的變量數(shù)一致,否則,在存儲過程執(zhí)行的時候,MySQL 會提示錯誤
2.4 關(guān)閉游標(biāo)
CLOSE 游標(biāo)名稱; CLOSE cur_score;
3.案例
創(chuàng)建一個存儲過程,實(shí)現(xiàn)累加考試成績最高的幾個學(xué)員的總分,直到總和大于我們傳入的limit_total_grade的參數(shù)值,并且返回累加的人數(shù):total_count;
CREATE PROCEDURE PROC_CURSOR(IN LIMIT_TOTAL_GRADE INT, OUT TOTAL_COUNT INT ) BEGIN # 聲明相關(guān)的變量 DECLARE SUM_GRADE INT DEFAULT 0; # 累加的總成績 DECLARE CURSOR_GRADE INT DEFAULT 0; # 記錄某條成績 DECLARE SCORE_COUNT INT DEFAULT 0; # 記錄累加的記錄數(shù) # 定義游標(biāo) DECLARE SCORE_CURSOR CURSOR FOR SELECT GRADE FROM SCORE ORDER BY GRADE ; # 打開游標(biāo) OPEN SCORE_CURSOR; # 使用游標(biāo) REPEAT FETCH SCORE_CURSOR INTO CURSOR_GRADE; # 從游標(biāo)中獲取一條數(shù)據(jù) SET SUM_GRADE = SUM_GRADE + CURSOR_GRADE; # 成績累加 SET SCORE_COUNT = SCORE_COUNT + 1; # 記錄累加的次數(shù) UNTIL SUM_GRADE > LIMIT_TOTAL_GRADE # 退出條件 END REPEAT ; # 復(fù)制OUT參數(shù) SET TOTAL_COUNT = SCORE_COUNT; # 關(guān)閉游標(biāo) CLOSE SCORE_CURSOR; END; DROP PROCEDURE PROC_CURSOR # 調(diào)用存儲過程 SET @s_count = 0; CALL PROC_CURSOR(400,@s_count) ; SELECT @s_count;
觸發(fā)器
1.觸發(fā)器概述
MySQL觸發(fā)器是MySQL數(shù)據(jù)庫中的一種特殊對象,它允許在表中插入、更新或刪除數(shù)據(jù)時自動執(zhí)行一系列指定的操作。觸發(fā)器可以在特定的數(shù)據(jù)庫操作(例如INSERT、UPDATE、DELETE)發(fā)生時被觸發(fā)。MySQL觸發(fā)器可以用于實(shí)現(xiàn)各種自動化任務(wù)和業(yè)務(wù)邏輯。它們可以執(zhí)行諸如數(shù)據(jù)驗(yàn)證、審計記錄、數(shù)據(jù)同步等操作。通過觸發(fā)器,可以在數(shù)據(jù)庫層面上處理數(shù)據(jù)相關(guān)的邏輯,避免了在應(yīng)用程序中手動編寫重復(fù)的代碼。
2.觸發(fā)器創(chuàng)建
2.1 語法結(jié)構(gòu)
CREATE TRIGGER 觸發(fā)器名稱
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW
觸發(fā)器執(zhí)行的語句塊;
說明:
- 表名 :表示觸發(fā)器監(jiān)控的對象。
- BEFORE|AFTER :表示觸發(fā)的時間。BEFORE 表示在事件之前觸發(fā);AFTER 表示在事件之后觸發(fā)。
INSERT|UPDATE|DELETE :表示觸發(fā)的事件。
INSERT 表示插入記錄時觸發(fā);
UPDATE 表示更新記錄時觸發(fā);
DELETE 表示刪除記錄時觸發(fā)。 - 觸發(fā)器執(zhí)行的語句塊 :可以是單條SQL語句,也可以是由BEGIN…END結(jié)構(gòu)組成的復(fù)合語句塊。
2.2 代碼案例
創(chuàng)建案例表
CREATE TABLE test_trigger ( id INT PRIMARY KEY AUTO_INCREMENT, t_note VARCHAR(30) ); CREATE TABLE test_trigger_log ( id INT PRIMARY KEY AUTO_INCREMENT, t_log VARCHAR(30) );
創(chuàng)建觸發(fā)器:創(chuàng)建名稱為before_insert的觸發(fā)器,向test_trigger數(shù)據(jù)表插入數(shù)據(jù)之前,向test_trigger_log數(shù)據(jù)表中插入before_insert的日志信息。
CREATE TRIGGER BEFORE_INSERT
BEFORE INSERT ON TEST_TRIGGER
FOR EACH ROW
BEGIN
INSERT INTO TEST_TRIGGER_LOG(T_LOG)VALUES('BEFORE_INSERT ....') ;
END;
向test_trigger中插入對應(yīng)的記錄
insert into test_trigger(t_note)values('test data');
查看test_trigger_log中是否有記錄
select * from test_trigger_log;
3.查看和刪除
3.1 查看觸發(fā)器
方式1:查看當(dāng)前數(shù)據(jù)庫的所有觸發(fā)器的定義
SHOW TRIGGERS\G
方式2:查看當(dāng)前數(shù)據(jù)庫中某個觸發(fā)器的定義
SHOW CREATE TRIGGER 觸發(fā)器名
方式3:從系統(tǒng)庫information_schema的TRIGGERS表中查詢“salary_check_trigger”觸發(fā)器的信息
SELECT * FROM information_schema.TRIGGERS;
3.2 刪除觸發(fā)器
DROP TRIGGER IF EXISTS 觸發(fā)器名稱;
到此這篇關(guān)于MySql 游標(biāo)和觸發(fā)器概念及使用詳解的文章就介紹到這了,更多相關(guān)mysql游標(biāo)觸發(fā)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows下MySQL服務(wù)啟動常見的兩種方式(適配5.7和8.0)
本文主要介紹了Windows下MySQL服務(wù)啟動常見的兩種方式(適配5.7和8.0),文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
k8s上運(yùn)行的mysql、mariadb數(shù)據(jù)庫的備份記錄(支持x86和arm兩種架構(gòu))
本文記錄在K8s上運(yùn)行的MySQL/MariaDB備份方案,通過工具容器執(zhí)行mysqldump,結(jié)合定時任務(wù)實(shí)現(xiàn)自動備份,支持X86和ARM架構(gòu),并強(qiáng)調(diào)cron環(huán)境需轉(zhuǎn)義%符號及避免使用-it參數(shù),對k8s?mysql、mariadb數(shù)據(jù)庫備份步驟感興趣的朋友一起看看吧2025-06-06
MySQL重啟之后無法寫入數(shù)據(jù)的問題排查及解決
客戶在給系統(tǒng)打補(bǔ)丁之后需要重啟服務(wù)器,數(shù)據(jù)庫在重啟之后,read_only 的設(shè)置與標(biāo)準(zhǔn)配置 文件中不一致,導(dǎo)致主庫在啟動之后無法按照預(yù)期寫入,所以本文給大家介紹了MySQL重啟之后無法寫入數(shù)據(jù)的問題排查及解決,需要的朋友可以參考下2024-05-05

