MySql 游標(biāo)和觸發(fā)器概念及使用詳解
游標(biāo)
1.什么是游標(biāo)
MySQL游標(biāo)是一種數(shù)據(jù)庫(kù)對(duì)象,它用于在數(shù)據(jù)庫(kù)查詢過(guò)程中迭代訪問(wèn)結(jié)果集中的每一行。游標(biāo)可以被看作是一個(gè)指向查詢結(jié)果集的指針,通過(guò)移動(dòng)游標(biāo),可以按行讀取和處理結(jié)果集的數(shù)據(jù)。在MySQL中,游標(biāo)可以用于在存儲(chǔ)過(guò)程或函數(shù)中處理復(fù)雜的業(yè)務(wù)邏輯,例如逐行處理查詢結(jié)果、循環(huán)操作數(shù)據(jù)等。使用游標(biāo)可以讓我們更加靈活地處理結(jié)果集。
2.使用游標(biāo)的步驟
游標(biāo)必須在聲明處理程序之前被聲明,并且變量和條件還必須在聲明游標(biāo)或處理程序之前被聲明。如果我們想要使用游標(biāo),一般需要經(jīng)歷四個(gè)步驟。不同的 DBMS 中,使用游標(biāo)的語(yǔ)法可能略有不同
2.1 聲明游標(biāo)
使用DECLARE關(guān)鍵字來(lái)聲明游標(biāo),其語(yǔ)法的基本形式如下:
DECLARE cursor_name CURSOR FOR select_statement;
要使用 SELECT 語(yǔ)句來(lái)獲取數(shù)據(jù)結(jié)果集,而此時(shí)還沒(méi)有開(kāi)始遍歷數(shù)據(jù),這里 select_statement 代表的是SELECT 語(yǔ)句,返回一個(gè)用于創(chuàng)建游標(biāo)的結(jié)果集。比如:
DECLARE cur_score CURSOR FOR SELECT stu_id,grade FROM score;
2.2 打開(kāi)游標(biāo)
OPEN 游標(biāo)名稱 -- 例如 open cur_score;
2.3 使用游標(biāo)
這句的作用是使用 cursor_name 這個(gè)游標(biāo)來(lái)讀取當(dāng)前行,并且將數(shù)據(jù)保存到 var_name 這個(gè)變量中,游標(biāo)指針指到下一行。如果游標(biāo)讀取的數(shù)據(jù)行有多個(gè)列名,則在 INTO 關(guān)鍵字后面賦值給多個(gè)變量名即可。
注意: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ù)一致,否則,在存儲(chǔ)過(guò)程執(zhí)行的時(shí)候,MySQL 會(huì)提示錯(cuò)誤
2.4 關(guān)閉游標(biāo)
CLOSE 游標(biāo)名稱; CLOSE cur_score;
3.案例
創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,實(shí)現(xiàn)累加考試成績(jī)最高的幾個(gè)學(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; # 累加的總成績(jī) DECLARE CURSOR_GRADE INT DEFAULT 0; # 記錄某條成績(jī) DECLARE SCORE_COUNT INT DEFAULT 0; # 記錄累加的記錄數(shù) # 定義游標(biāo) DECLARE SCORE_CURSOR CURSOR FOR SELECT GRADE FROM SCORE ORDER BY GRADE ; # 打開(kāi)游標(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; # 成績(jī)累加 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)用存儲(chǔ)過(guò)程 SET @s_count = 0; CALL PROC_CURSOR(400,@s_count) ; SELECT @s_count;
觸發(fā)器
1.觸發(fā)器概述
MySQL觸發(fā)器是MySQL數(shù)據(jù)庫(kù)中的一種特殊對(duì)象,它允許在表中插入、更新或刪除數(shù)據(jù)時(shí)自動(dòng)執(zhí)行一系列指定的操作。觸發(fā)器可以在特定的數(shù)據(jù)庫(kù)操作(例如INSERT、UPDATE、DELETE)發(fā)生時(shí)被觸發(fā)。MySQL觸發(fā)器可以用于實(shí)現(xiàn)各種自動(dòng)化任務(wù)和業(yè)務(wù)邏輯。它們可以執(zhí)行諸如數(shù)據(jù)驗(yàn)證、審計(jì)記錄、數(shù)據(jù)同步等操作。通過(guò)觸發(fā)器,可以在數(shù)據(jù)庫(kù)層面上處理數(shù)據(jù)相關(guān)的邏輯,避免了在應(yīng)用程序中手動(dòng)編寫(xiě)重復(fù)的代碼。
2.觸發(fā)器創(chuàng)建
2.1 語(yǔ)法結(jié)構(gòu)
CREATE TRIGGER 觸發(fā)器名稱
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW
觸發(fā)器執(zhí)行的語(yǔ)句塊;
說(shuō)明:
- 表名 :表示觸發(fā)器監(jiān)控的對(duì)象。
- BEFORE|AFTER :表示觸發(fā)的時(shí)間。BEFORE 表示在事件之前觸發(fā);AFTER 表示在事件之后觸發(fā)。
INSERT|UPDATE|DELETE :表示觸發(fā)的事件。
INSERT 表示插入記錄時(shí)觸發(fā);
UPDATE 表示更新記錄時(shí)觸發(fā);
DELETE 表示刪除記錄時(shí)觸發(fā)。 - 觸發(fā)器執(zhí)行的語(yǔ)句塊 :可以是單條SQL語(yǔ)句,也可以是由BEGIN…END結(jié)構(gòu)組成的復(fù)合語(yǔ)句塊。
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中插入對(duì)應(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ù)庫(kù)的所有觸發(fā)器的定義
SHOW TRIGGERS\G
方式2:查看當(dāng)前數(shù)據(jù)庫(kù)中某個(gè)觸發(fā)器的定義
SHOW CREATE TRIGGER 觸發(fā)器名
方式3:從系統(tǒng)庫(kù)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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL事務(wù)的四大特性以及并發(fā)事務(wù)問(wèn)題解讀
這篇文章主要介紹了MySQL事務(wù)的四大特性以及并發(fā)事務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
mysql解析json數(shù)據(jù)組獲取數(shù)據(jù)組所有字段的方法實(shí)例
mysql在5.7開(kāi)始支持json解析了,也可以解析數(shù)組,下面這篇文章主要給大家介紹了關(guān)于mysql解析json數(shù)據(jù)組獲取數(shù)據(jù)組所有字段的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
Mysql 忘記root密碼和修改root密碼的解決方法(小結(jié))
這篇文章主要介紹了Mysql 忘記root密碼和修改root密碼的解決方法(小結(jié)),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
MYSQL中IFNULL和NULLIF函數(shù)的區(qū)別小結(jié)
IFNULL()和NULLIF()是?MySQL中兩個(gè)功能完全不同的函數(shù),它們?cè)谔幚?NULL值時(shí)有著不同的用途和行為,下面就來(lái)具體介紹一下,感興趣的可以了解一下2025-08-08
MySQL占用CPU過(guò)高排查過(guò)程及可能優(yōu)化方案
這篇文章主要介紹了MySQL占用CPU過(guò)高排查過(guò)程及可能優(yōu)化方案,具有很好的參考價(jià)值,希望對(duì)大家的學(xué)習(xí)或工作有所幫助,感興趣的朋友可以參考下2024-01-01
Mac os 解決無(wú)法使用localhost連接mysql問(wèn)題
今天在mac上搭建好了php的環(huán)境,把先前在window、linux下運(yùn)行良好的程序放在mac上,居然出現(xiàn)訪問(wèn)不了數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)連接的host用的是localhost,可以確認(rèn)數(shù)據(jù)庫(kù)配置是正確的,下面特為大家分享下2014-05-05
window下mysql 8.0.15 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了window下mysql 8.0.15 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
MySQL 的 REPLACE 函數(shù)用途與語(yǔ)句示例詳解
文章介紹了MySQL的REPLACE函數(shù)和REPLACEINTO語(yǔ)句的用途、語(yǔ)法和示例,REPLACE函數(shù)用于字符串替換,而REPLACEINTO語(yǔ)句用于插入或替換整行記錄,兩者都可以在特定條件下執(zhí)行寫(xiě)操作,但REPLACEINTO是真正的刪除和插入操作,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-11-11
新建一個(gè)MySQL數(shù)據(jù)庫(kù)的簡(jiǎn)單教程
這篇文章主要介紹了新建一個(gè)MySQL數(shù)據(jù)庫(kù)的簡(jiǎn)單教程,是MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05

