最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中觸發(fā)器和游標的介紹與使用

 更新時間:2021年03月16日 09:05:40   作者:今天打代碼刷題了嗎  
這篇文章主要給大家介紹了關于MySQL中觸發(fā)器和游標的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

觸發(fā)器簡介

觸發(fā)器是和表關聯(lián)的特殊的存儲過程,可以在插入,刪除或修改表中的數(shù)據(jù)時觸發(fā)執(zhí)行,比數(shù)據(jù)庫本身標準的功能有更精細和更復雜的數(shù)據(jù)控制能力。

觸發(fā)器的優(yōu)點:

  • 安全性:可以基于數(shù)據(jù)庫的值使用戶具有操作數(shù)據(jù)庫的某種權利。例如不允許下班后和節(jié)假日修改數(shù)據(jù) 庫數(shù)據(jù);
  • 審計:可以跟蹤用戶對數(shù)據(jù)庫的操作;
  • 實現(xiàn)復雜的數(shù)據(jù)完整性規(guī)則。例如,觸發(fā)器可回退任何企圖吃進超過自己保證金的期貨;
  • 提供了運行計劃任務的另一種方法。例如,如果公司的帳號上的資金低于 5 萬元則立即給財務人員發(fā)送 警告數(shù)據(jù)。

MySQL 中使用觸發(fā)器

創(chuàng)建觸發(fā)器

創(chuàng)建觸發(fā)器的技巧就是記住觸發(fā)器的四要素:

  • 監(jiān)控地點:table;
  • 監(jiān)控事件:insert/update/delete;
  • 觸發(fā)時間:after/before;
  • 觸發(fā)事件:insert/update/delete。

創(chuàng)建觸發(fā)器的基本語法如下所示:

CREATE TRIGGER
-- trigger_name:觸發(fā)器的名稱; 
-- tirgger_time:觸發(fā)時機,為 BEFORE 或者 AFTER;
-- trigger_event:觸發(fā)事件,為 INSERT、DELETE 或者 UPDATE; 
 trigger_name trigger_time trigger_event 
 ON
 -- tb_name:表示建立觸發(fā)器的表名,在哪張表上建立觸發(fā)器;
 tb_name
 -- FOR EACH ROW 表示任何一條記錄上的操作滿足觸發(fā)事件都會觸發(fā)該觸發(fā)器。
 FOR EACH ROW
 -- trigger_stmt:觸發(fā)器的程序體,可以是一條 SQL 語句或者是用 BEGIN 和 END 包含的多條語句; 
 trigger_stmt
  • trigger_name:觸發(fā)器的名稱;
  • tirgger_time:觸發(fā)時機,為 BEFORE 或者 AFTER;
  • trigger_event:觸發(fā)事件,為 INSERT、DELETE 或者 UPDATE;
  • tb_name:表示建立觸發(fā)器的表名,在哪張表上建立觸發(fā)器;
  • trigger_stmt:觸發(fā)器的程序體,可以是一條 SQL 語句或者是用 BEGIN 和 END 包含的多條語句;
  • FOR EACH ROW 表示任何一條記錄上的操作滿足觸發(fā)事件都會觸發(fā)該觸發(fā)器。

注意:對同一個表相同觸發(fā)時間的相同觸發(fā)事件,只能定義一個觸發(fā)器。

觸發(fā)器新舊記錄

MySQL 中定義了 NEW 和 OLD,用來表示觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù):

  • 在 INSERT 型觸發(fā)器中,NEW 用來表示將要(BEFORE或已經(jīng)(AFTER)插入的新數(shù)據(jù);
  • 在 UPDATE型觸發(fā)器中,OLD 用來表示將要或已經(jīng)被修改的原數(shù)據(jù),NEW 用來表示將要或已經(jīng)修改為的新 數(shù)據(jù);
  • 在 DELETE型觸發(fā)器中,OLD 用來表示將要或已經(jīng)被刪除的原數(shù)據(jù)。

創(chuàng)建觸發(fā)器,當用戶購買商品時,同時更新對應商品庫存記錄,代碼如下所示:

-- 刪除觸發(fā)器,drop trigger 觸發(fā)器名稱
-- if exists判斷存在才會刪除
drop trigger if exists myty1;
-- 創(chuàng)建觸發(fā)器
create trigger mytg1-- myty1觸發(fā)器的名稱
after insert on orders-- orders在哪張表上建立觸發(fā)器;
for each row
begin
	update product set num = num-new.num where pid=new.pid;
end;
-- 往訂單表插入記錄
insert into orders values(null,2,1);
-- 查詢商品表商品庫存更新情況
select * from product;

創(chuàng)建觸發(fā)器,當用戶刪除訂單時,同時更新對應商品庫存記錄,代碼如下所示:

-- 創(chuàng)建觸發(fā)器
create trigger mytg2
after delete on orders
for each ROW
begin 
-- 對庫存進行回退,重新加上
	update product set num = num+old.num where pid=old.pid;
end;
-- 刪除訂單記錄
delete from orders where oid = 2;
-- 查詢商品表商品庫存更新情況
select * from product;

before 和 after 的區(qū)別

before 在執(zhí)行語句之前after 在執(zhí)行語句之后

當訂單商品數(shù)量超過庫存時,修改訂單數(shù)量為最大庫存:

-- -- 創(chuàng)建 before 觸發(fā)器
create trigger mytg3
before insert on orders
for each row 
begin 
	-- 定義一個變量,來接收庫存
	declare n int default 0;
	-- 查詢庫存 把num賦值給n
	select num into n from product where pid = new.pid;
	-- 判斷下單的數(shù)量是否大于庫存量
	if new.num>n then
		-- 大于修改下單庫存(庫存改為最大量)
	set new.num = n;
	end if;
	update product set num = num-new.num where pid=new.pid;
end;
-- 往訂單表插入記錄
insert into orders values(null,3,50);
-- 查詢商品表商品庫存更新情況
select * from product;
-- 查詢訂單表
select * from orders;

游標

游標簡介

游標的作用就是用于對查詢數(shù)據(jù)庫所返回的記錄進行遍歷,以便進行相應的操作。游標有下面這些特征

  • 游標是只讀的,也就是不能更新它;
  • 游標是不能滾動的,也就是只能在一個方向上進行遍歷,不能在記錄之間隨意進退,不能跳過某些記錄;
  • 避免在已經(jīng)打開游標的表上更新數(shù)據(jù)。

創(chuàng)建游標

創(chuàng)建游標的語法包含四個部分:

  • 定義游標:declare 游標名 cursor for select 語句;
  • 打開游標:open 游標名;
  • 獲取結果:fetch游標名 into 變量名[,變量名];
  • 關閉游標:close 游標名;

創(chuàng)建一個過程 p1,使用游標返回 test 數(shù)據(jù)庫中 student 表的第一個學生信息。代碼如下所示:

-- 定義過程
create procedure p1()
begin 
	declare id int;
	declare name varchar(20);
	declare age int;
	-- 定義游標 declare 游標名 cursor for select 語句;
	declare mc cursor for select * from student;
	-- 打開游標 open 游標名;
	open mc;
	-- 獲取數(shù)據(jù) fetch 游標名 into 變量名[,變量名];
	fetch mc into id,name,age;
	-- 打印
	select id,name,age;
	-- 關閉游標
	close mc;
end;
-- 調(diào)用過程
call p1();

在 test 數(shù)據(jù)庫創(chuàng)建一個 student2 表,創(chuàng)建一個過程 p2,使用游標提取 student 表中所有學生信息插入到 student2 表中。代碼如下所示:

-- 定義過程
create procedure p3()
begin 
	declare id int;
	declare name varchar(20);
	declare age int;
	declare flag int default 0;
	-- 定義游標 declare 游標名 cursor for select 語句;
	declare mc cursor for select * from student;
	declare continue handler for not found set flag=1;
	-- 打開游標 open 游標名;
	open mc;
	-- 獲取數(shù)據(jù) fetch 游標名 into 變量名[,變量名];
	a:loop -- 循環(huán)獲取數(shù)據(jù)
	fetch mc into id,name,age;
	if flag=1 then -- 當無法fetch時觸發(fā)continue handler
	leave a;-- 終止循環(huán)
	end if;
	-- 進行遍歷,將提取的每一行數(shù)據(jù)插入到 student2 表中
	insert into student2 values(id,name,age);
	end loop;
	-- 關閉游標
	close mc;
end;
-- 調(diào)用過程
call p3();
-- 查詢 student2 表
select * from student2;

總結

到此這篇關于MySQL中觸發(fā)器和游標的文章就介紹到這了,更多相關MySQL觸發(fā)器和游標內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復數(shù)據(jù)

    MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復數(shù)據(jù)

    這篇文章主要介紹了MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 簡述MySQL 正則表達式

    簡述MySQL 正則表達式

    大家都知道MySQL可以通過 LIKE ...% 來進行模糊匹配,MySQL 同樣也支持其他正則表達式的匹配, MySQL中使用 REGEXP 操作符來進行正則表達式匹配。對mysql正則表達式知識感興趣的朋友一起看看吧
    2016-11-11
  • Ubuntu 14.04下安裝MySQL

    Ubuntu 14.04下安裝MySQL

    1、更新源列表打開"終端窗口",輸入"sudo apt-getupdate"-->回車-->"輸入root用戶的密碼"-->回車,就可以了。如果不運行該命令,直接安裝mysql,會出現(xiàn)"有幾個軟件包無法下載,您可以運行apt-getupdate------"的錯誤提示,導致無法安裝。
    2016-04-04
  • mysql數(shù)據(jù)庫如何導入導出sql文件

    mysql數(shù)據(jù)庫如何導入導出sql文件

    這篇文章主要介紹了mysql數(shù)據(jù)庫如何導入導出sql文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • MySQL刪除數(shù)據(jù)后自增主鍵ID不連貫問題及解決

    MySQL刪除數(shù)據(jù)后自增主鍵ID不連貫問題及解決

    這篇文章主要介紹了MySQL刪除數(shù)據(jù)后自增主鍵ID不連貫問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • MySQL的增刪查改語句用法示例總結

    MySQL的增刪查改語句用法示例總結

    這篇文章主要介紹了MySQL的增刪查改語句用法示例總結,是對MySQL學習的基本知識點的一個歸納,需要的朋友可以參考下
    2015-05-05
  • 揭秘SQL優(yōu)化技巧 改善數(shù)據(jù)庫性能

    揭秘SQL優(yōu)化技巧 改善數(shù)據(jù)庫性能

    這篇文章是以 MySQL 為背景,很多內(nèi)容同時適用于其他關系型數(shù)據(jù)庫,需要有一些索引知識為基礎,重點講述如何優(yōu)化SQL,來提高數(shù)據(jù)庫的性能
    2012-01-01
  • 關于mysql?left?join?查詢慢時間長的踩坑總結

    關于mysql?left?join?查詢慢時間長的踩坑總結

    這篇文章主要介紹了關于mysql?left?join?查詢慢時間長的踩坑總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • MySQL查看數(shù)據(jù)庫連接數(shù)的方法

    MySQL查看數(shù)據(jù)庫連接數(shù)的方法

    本文主要介紹了MySQL查看數(shù)據(jù)庫連接數(shù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • MySQL rand函數(shù)實現(xiàn)隨機數(shù)的方法

    MySQL rand函數(shù)實現(xiàn)隨機數(shù)的方法

    在mysql中,使用隨機數(shù)寫一個語句能一下更新幾百條MYSQL數(shù)據(jù)嗎?答案是肯定的,使用MySQL rand函數(shù),就可以使現(xiàn)在隨機數(shù)
    2016-09-09

最新評論

怀来县| 青川县| 蓬莱市| 平乐县| 辽阳市| 衡山县| 高雄县| 溧水县| 云南省| 易门县| 华坪县| 剑阁县| 隆回县| 建宁县| 历史| 治县。| 清新县| 浦县| 邯郸市| 利川市| 临海市| 龙陵县| 四平市| 三明市| 清涧县| 和平区| 许昌市| 那曲县| 凤山市| 武安市| 含山县| 桦川县| 昌邑市| 卢氏县| 河津市| 桦甸市| 邯郸县| 武邑县| 磐安县| 保定市| 秦皇岛市|