主頁 > 資料庫 > MySQL 存盤程序&觸發器&事務

MySQL 存盤程序&觸發器&事務

2023-05-16 15:29:30 資料庫

存盤程序

概念

存盤程序(Stored Procedure),是為了完成特定功能的SQL陳述句集,

優點

存盤程序可以理解為shell腳本這型別的命令集輸出工具,但是在底層,存盤程序擁有更多的優點:

  • 語言的靈活性跟功能性更強,在原有基礎之上可以插入控制陳述句、回圈陳述句等讓SQL陳述句的功能更強,能夠完成更復雜的運算跟判斷,
  • 封裝性,存盤程序被創建后,可以在被多次呼叫,同時可以進行修改,對程式原始碼不造成影響,
  • 執行速度快,MySQL的陳述句在執行程序中會有一個[[MySQL語言的編譯|轉譯程序]],當資料庫體量到達一定的級別的時候,對性能的影響很大,而使用存盤程序的時候,執行過一次以后,產生的二進制代碼就會被預留在快取區,不需要再次編譯,
  • 減少網路流量,因為不需要進行轉譯了所以在日常使用中會減少對網路流量的使用,
  • 提高資料庫的完整性和安全性,基于上述的封裝性,可以對用戶的使用權限進行更好的限制,不需要給到更多的權限的同時也能夠進行所需的查詢,從而也保護了資料的完整性,

創建&呼叫 存盤程序

呼叫語法

CALL 程序名稱(引數1,引數2...)

創建語法

 CREATE PROCEDURE <存盤程序別名> ( [程序引數[,…] ] ) <程序體>

程序引數的格式

[ IN | OUT | INOUT ] <引數名> <型別>

示例

[[99-MySQL補充#MySQL分隔符|修改分隔符]],再寫存盤程序

DELIMITER :

CREATE PROCEDURE SE()
BEGIN
SELECT * FROM learn.books;
END :

DELIMITER ;
CALL SE();

結束的時候在記得將分隔符修改回默認的,

MySQL變數

定義&呼叫變數

在MySQL界面中使用 SET 定義變數,用 SELECT 呼叫變數,

SET @a=1;
SELECT @a;

此處定義的變數為臨時變數,僅該次連接可用,當需要全域長期使用時,需要修改全域變數

存盤程序與變數

MySQL存盤程序中使用 DECLARE 定義變數,變數僅作用于本次存盤程序內,屬于區域變數,同時需要對變數定義欄位屬性,呼叫時直接用宣告了的變數名呼叫即可,

變數的傳遞

  1. IN:將變數傳入存盤程序
  2. OUT:將存盤程序內的變數傳出到MySQL變數中
  3. INOUT:變數進入存盤程序又出來到MySQL變數中

示例IN

DELIMITER :

CREATE PROCEDURE getone(in id INT)
BEGIN
SELECT bname,bid FROM books WHERE bid=id;
END :

DELIMITER ;

CALL getone(1);
  1. 這里的變數是IN進行傳遞到存盤程序之中,并定義了變數型別為整數,
  2. 這里將引數傳入存盤程序,所以在呼叫的時候需要給到傳入引數,

示例OUT

DELIMITER :

CREATE PROCEDURE outone(OUT nu INT)
BEGIN
SET nu=1;
SELECT nu;
END:

DELIMITER ;

CALL outone(@num); 
SELECT @num;

這里將內部引數傳遞到了外部,并用num進行了接收,

示例INOUT

DELIMITER :
CREATE PROCEDURE inoutone(IN bookid INT,OUT bookname VARCHAR(255))

BEGIN
	SELECT bname into bookname FROM learn.books WHERE bid=bookid;
END:

DELIMITER ;
CALL inoutone(1,@a); 

INOUT的引數傳遞需要注意呼叫跟輸入的對應關系

存盤程序的回圈

WHILE 回圈

  • 創建測驗表 
    create table pwhile(id int);
  • 在存盤程序中while的結構為

WHILE DO ... END WHILE

  • 示例
DELIMITER :

CREATE PROCEDURE pwhile()
BEGIN
	DECLARE i INT;
	SET i = 0;
	
	WHILE i < 10 DO
		INSERT INTO test VALUES(i) ;
		SET i = i + 1;
	END WHILE;
	
	SELECT * FROM test;
END :

DELIMITER ;
CALL pwhile();

REPEAT回圈

  • 創建測驗表
    `create table ptest(id int
  • REPEAT回圈結構為

REPEAT...UNTIL...END REPEAT

  • 示例
DELIMITER :

CREATE PROCEDURE arepeat()
BEGIN
	DECLARE i INT;
	SET i = 0;
	
	REPEAT
		INSERT INTO ptest VALUES(i) ;
		SET i = i + 1;
	UNTIL i > 10 END REPEAT;
	
	SELECT * FROM ptest;
END :

DELIMITER ;
CALL arepeat();

loop回圈

  • 創建測驗表 
    cerate table ltest
  • loop回圈結構 

lp:loop ... if ... end if ... end loop

  • 示例 
DELIMITER :

CREATE PROCEDURE tloop()
BEGIN
	DECLARE i INT;
	SET i = 0;
	
LP:LOOP
	INSERT INTO ltest VALUES(i) ;
	SET i = i + 1;
	IF i > 10 THEN
	LEAVE LP
END LOOP

	SELECT * FROM ltest;
END :

DELIMITER ;
CALL tloop();

LP:LOOP 是對LOOP取了一個別名為LP

查詢&洗掉 存盤程序

指定庫名稱查詢SELECT

SELECT name FROM mysql.proc WHERE db='[資料庫名]' AND type='procedure';

指定存盤程序的名稱查詢SHOW

SHOW procedure STATUS LIKE '[存盤程序名稱]' \G

洗掉存盤程序DROP

DROP PROCEDURE IF EXISTS [存盤程序名稱];

MySQL觸發器 TRIGRRER

概念

觸發器是一個特殊的存盤程序,區別點在于存盤程序需要使用CALL陳述句來呼叫,觸發器的執行不需要,也不需要手動啟動,只需要一個預定義事件就會被MySQL自動呼叫,

場景

主要用于保護資料,尤其是多表相互鏈接的時候,觸發器能夠讓被鏈接的表之間保持一致性,

預定義事件

即是指觸發觸發器的場景,能夠觸發觸發器的事件,有且只有 INSERT/UPDATE/DELETE 操作時才能觸發,

觸發器種類

根據預定義事件的分類,觸發也分為以下三種: 

  1. INSERT 觸發器
  2. UPDATE 觸發器
  3. DELETE 觸發器
    此三類觸發器可指定在對應命令執行前或后激活觸發器,

創建觸發器

語法

CREATE TRIGGER <觸發器名稱> 
<觸發時機 AFTER|BEFORE>
<觸發事件 UPDATE|DELETE|INSERT> 
ON <需觸發的表 路徑> FOR EACH ROW <觸發器主體>;

補充點

  1. 同一個表中的不能有觸發時機觸發事件相同的觸發器
  2. 觸發器關聯的表要有永久性,不能將觸發器與臨時表、視圖關聯
  3. FOR EACH ROW:行級觸發
  4. 觸發器主體:指的是觸發器激活時執行的陳述句,要執行多個陳述句時,可以使用BEGIN END復合陳述句結構

查看觸發器

SHOW TRIGGERS;

觸發器中NEW和OLD

關于NEW和OLD,可以理解為一個特殊的表,定位了發生變化的資料型別,

在INSER中

NEW 用來表示將要(BEFORE)或已經(AFTER)插入的新資料;
image.png

在UPDATE中

NEW 用來表示將要(BEFORE)或已經(AFTER)插入的新資料;
image.png

在DELETE中

OLD 用來表示將要或已經被洗掉的原資料;
image.png

創建觸發器

簡單觸發器

觸發器的創建程序其實也是一個存盤程序的創建

DELIMITER :

CREATE TRIGGER delcategory AFTER DELETE ON category FOR EACH ROW
	
	DELETE FROM books WHERE btypeid=3;
	:

DELIMITER ;

image.png

NEW/OLD 的觸發器

OLD 示例

當category表發生洗掉操作后,books表也會根據btypeid進行洗掉操作

DELIMITER :

CREATE TRIGGER cbook AFTER DELETE 
ON category FOR EACH ROW

	BEGIN
	DELETE FROM books WHERE books.btypeid=old.btypeid;
	END :

DELIMITER ;

old.btypeid 表示觸發器所在表category中發生洗掉的btypeid

NEW 示例

阻止對students表的更新操作,但洗掉跟插入不受影響,

DELIMITER :

CREATE TRIGGER ubook BEFORE UPDATE
ON students FOR EACH ROW

	BEGIN
	
	IF old.name is NOT NULL THEN
		SET new.name=old.name,new.id=old.id,new.age=old.age;
	END IF
	
	END :
	
DELIMITER ;

IF old.name is NOT NULL 如果 old表中name欄位不為空  

  • 此處new.name 是一個并不存在的值,而 old.name 是一個只讀的資料存在于原資料中,即是將發生更新前的資料賦值給到了old.name
利用Pessimistic Lock的觸發器
CREATE TRIGGER tr_MyTrigger ON tablename FOR UPDATE AS 

UPDATE table1 SET column1 = data1
INNER JOIN deleted d ON table1.id = d.id 

UPDATE table2 SET column2 = data2 
INNER JOIN deleted d ON table2.id = d.id 

UPDATE table3 SET column3 = data3 
INNER JOIN deleted d ON table3.id = d.id

/* etc. */ GO
說明
  1. FOR UPDATE AS UPDATE 是一種在MySQL資料庫中實作悲觀鎖(Pessimistic Lock)的技術,它可以保證同一個記錄多執行緒下同時訪問時不會產生更新并發問題,
  2. /* etc. */ GO 是在SQL中常用的一個命令,它用于告訴SQL服務器要啟動對SQL腳本的執行,

事務

概念

  • MySQL資料庫事務(datebase transaction):MySQL事務是用來保證資料庫資料一致性和完整性的一種機制, 
  • 事務可以讓用戶將一系列的SQL陳述句保存在一個組中,并這些SQL陳述句作為一個單一的邏輯作業單元來執行, 
  • MySQL事務由4個指令定義:BEGIN開始事務;COMMIT提交事務;ROLLBACK回滾事務;SAVEPOINT設定一個事務保存點
  • MySQL為每個會話維護了一個隱形的transaction id,以及一個當前正在執行的transaction的id以及一個超時時間,這些都將決定當前正在作業的事務是否需要提交或回滾,
  • 僅支持INNODB和BDB兩種存盤引擎,

事務的特性ACID

原子性(Autmic)

指的是在事務操作的不可分割,僅有0和1,執行全部成功或者全部失敗,沒有部分成功部分失敗,

一致性(Consistency)

指的是在事務開始的前后,整個資料庫的一致性不受影響,資料完整性不受影響,

隔離性(Isolation)

指的是事務的執行是并行且獨立的,在事務完成之后才會將結果進行發布,整個程序中彼此是不可見的,避免事務的一個混亂,

持久性(Durability)

指的是事務執行完成后,所存盤的資料應該存盤在資料庫中,即使系統發送故障資料本身不受影響,

創建一個簡單事務

創建一個提交的

SELECT bname FROM books WHERE bid=1 OR bid=2;

SET AUTOCOMMIT=0;
DELIMITER :

START TRANSACTION;
	UPDATE books SET bname="cc" WHERE bid=1;
	UPDATE books SET bname="dd" WHERE bid=2;
	COMMIT;
:

DELIMITER ;

SET AUTOCOMMIT=0; 關閉自動提交事務
COMMIT; 提交事務

測驗回滾

回滾命令:rollback

當引擎不符合時無法回滾

SHOW CREATE TABLE books\G
SELECT bname WHERE bid=1 or bid=2;
ROLLBACK;
SELECT bname WHERE bid=1 or bid=2;

image.png

修改引擎后重新提交事務

引擎符合時

ALTER TABLE books ENGINE=INNODB;
SHOW CREATE TABLE books\G
SELECT bname WHERE bid=1 or bid=2;

DELIMITER :

START TRANSACTION;
	UPDATE books SET bname="cc" WHERE bid=1;
	UPDATE books SET bname="dd" WHERE bid=2;
:
DELIMITER ;


ROLLBACK;
SELECT bname WHERE bid=1 or bid=2;

回滾成功 
 
image.png

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/552585.html

標籤:其他

上一篇:pg_enterprise_views偶然發現的PG神仙插件!

下一篇:返回列表

標籤雲
其他(159120) Python(38137) JavaScript(25431) Java(18044) C(15226) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7191) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4572) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1973) 功能(1967) Web開發(1951) HtmlCss(1937) python-3.x(1918) C++(1917) 弹簧靴(1913) xml(1889) PostgreSQL(1877) .NETCore(1860) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • MySQL 存盤程序&觸發器&事務

    存盤程序 概念 存盤程序(Stored Procedure),是為了完成特定功能的SQL陳述句集。 優點 存盤程序可以理解為shell腳本這型別的命令集輸出工具,但是在底層,存盤程序擁有更多的優點: ==語言的靈活性跟功能性更強==,在原有基礎之上可以插入控制陳述句、回圈陳述句等讓SQL陳述句的功能更強,能 ......

    uj5u.com 2023-05-16 15:29:30 more
  • pg_enterprise_views偶然發現的PG神仙插件!

    一直從事資料庫相關的作業,對于PG而言最大的問題其實是在運維管理方面,其缺乏有效且直觀成體系的系統表,苦覓良久,今日在PG官網中發現了一款新收錄的免費插件,其提供了數十張系統表,內容涵蓋了從作業系統到資料庫的負載指標、等待事件、會話、客戶端、SQL、SQL執行計劃、超時鎖、長事務、資料庫物件、寫行程 ......

    uj5u.com 2023-05-16 15:28:49 more
  • Redis實戰解讀-初識Redis&Redis基本資料型別

    一.初識Redis
    1.什么是Redis
    ? Redis是一個速度非常快的非關系型資料庫(non-relational database),它可以存盤鍵(key)與五種不同型別的值的映射(mapping),可以將存盤在記憶體的鍵值對資料持久化到磁盤,可以使用復制特性來擴展讀性能,也可以采用客戶端分片來... ......

    uj5u.com 2023-05-16 15:28:18 more
  • Redis資料結構二之SDS和雙向鏈表

    本文首發于公眾號:Hunter后端 原文鏈接:Redis資料結構二之SDS和雙向鏈表 這一篇筆記介紹一下 SDS(simple dynamic string)和雙向鏈表。 以下是本篇筆記目錄: SDS 常數復雜度獲取字串長度 杜絕緩沖區溢位 減少修改字串帶來的記憶體重分配次數 二進制安全 兼容C字 ......

    uj5u.com 2023-05-16 15:28:08 more
  • MySQL 8.0不再擔心被垃圾SQL搞爆記憶體

    MySQL 8.0.28引入的新功能 MySQL 8.0.28開始,新增一個特性,支持監控統計并限制各個連接(會話)的記憶體消耗,避免大量用戶連接因為執行垃圾SQL消耗過多記憶體,造成可能被OOM kill的風險。 首先,需要先設定系統選項 global_connection_memory_tracki ......

    uj5u.com 2023-05-16 15:27:50 more
  • 06~12-Esp8266物聯網芯片的使用(一)-part02/03-ESP8266開發環境、

    上一章主要作了芯片介紹,這一章主要作對開發環境的介紹。 認識Arduino Arduino是一款便捷靈活、方便上手的開源電子原型平臺。包含硬體(各種型號的Arduino板)和軟體(ArduinoIDE)。它構建于開放原始碼simple I/O介面版,并且具有使用類似Java、C語言的Processi ......

    uj5u.com 2023-05-16 15:22:35 more
  • MySQL的varchar存盤原理:InnoDB記錄存盤結構

    摘要:varchar(M) 能存多少個字符,為什么提示最大16383?innodb怎么知道varchar真正有多長?記錄為NULL,innodb如何處理?某個列資料占用的位元組數非常多怎么辦?影響每行實際可用空間的因素有哪些?本篇圍繞innodb默認行格式dynamic來說說原理。 本文分享自華為云社 ......

    uj5u.com 2023-05-16 15:16:31 more
  • 架構師日記-從資料庫發展歷程到資料結構設計探析

    本文針對資料存盤相關名詞概念進行了解釋,重點介紹了資料庫技術的發展史。為了豐富文章的可讀性以及實用性,又從資料結構設計層面進行了部分技術實戰能力的外延擴展,闡述了拉鏈表,位運算,環形佇列等相關資料結構在軟體開發領域的應用,希望本文給你帶來識訓。 ......

    uj5u.com 2023-05-16 15:15:50 more
  • MySQL 存盤程序&觸發器&事務

    存盤程序 概念 存盤程序(Stored Procedure),是為了完成特定功能的SQL陳述句集。 優點 存盤程序可以理解為shell腳本這型別的命令集輸出工具,但是在底層,存盤程序擁有更多的優點: ==語言的靈活性跟功能性更強==,在原有基礎之上可以插入控制陳述句、回圈陳述句等讓SQL陳述句的功能更強,能 ......

    uj5u.com 2023-05-16 15:15:37 more
  • hive 從入門到精通

    hive入門到精通 hive部署 啟動Hadoop # 啟動hadoop start-all.sh # 檢查hadoop行程 jps # 檢查各埠 netstat -aplnt | grep java 檢查MySQL是否啟動成功 ps -aux | grep mysql netstat -apln ......

    uj5u.com 2023-05-16 15:15:19 more