1. 程式人生 > >六天帶你玩轉Mysql筆記--第六天

六天帶你玩轉Mysql筆記--第六天

2. 變數

3 觸發器

5. 函式

6 儲存過程

1.事務安全

1)事務:一系列要發生的連續的操作。

2)事務安全:一種保護連續操作同時滿足(實現)的一種機制。

3)事務安全的意義:保證資料操作的完整性。

1.1 事務操作

事務操作分為兩種:自動事務(預設的),手動事務

1.1.1手動事務操作流程

(1)開啟時事務:告訴系統以下所有的操作(寫)不要直接寫入到資料表,先存放到事務日誌smart transaction

-- 開啟事務

start transaction;

(2)進行事務操作:一系列操作

1)李四賬戶減少1000

2)張三賬戶增多

1000

-- 事務操作1:李四的賬戶減少1000

update my_account set money = money - 1000 where id = 2;

-- 事務操作2:張三賬戶增加1000

update my_account set money = money + 1000 where id = 1;

 

3關閉事務:選擇性的將日誌檔案中操作的結果儲存到資料表(同步)或者直接清除事務日誌(原來操作全部清空)

1提交事務:同步資料表(操作成功):commit

 

2)回滾事務:直接清空日誌表(操作失敗):rollback

1.1.2 事務操作原理

事務開啟後,所有的操作都會臨時儲存到事務日誌,事務日誌只有得到

commit命令才會同步到資料表,其他任何情況都會清空(rollback,斷電和斷開連線)。

 

1.1.3 回滾點

(1)定義:在某個成功的操作完成之後,後續的操作有可能成功有可能失敗,但是不管成功還是失敗,前面的操作都已經成功。可以再在當前成功的位置,設定一個點。可以供後續失敗操作返回到該位置,而不是返回所有操作,這個點稱之為回滾點。

(2)設定回滾點語法:savepoint 回滾點名字;

(3)回到回滾點語法:rollback to 回滾點名字;

1.1.4 自動事務處理

1)在mysql中,預設的都是自動事務處理,使用者操作完成後會立即同步到資料庫。

2)自動事務:系統通過autocommit

變數控制

Show variables like autocommit;

 

(3)關閉事務自動提交

Set autocommit = off/0;

(4)自動關閉後,需要手動來選擇處理:commit/rollback

注意:通常開啟自動事務。

1.1.5 事務特性

事務有四大特性:A C I D

1)Atomic:原子性,事務的整個操作就是一個整體,不可分割,要麼全部成功,要麼全部失敗。

2)Consistency:一致性,事務操作的前後,資料表中的資料沒有變化。

3)Isolation:隔離性,事務操作時互相隔離不受影響。

4)Durability:永續性,資料一旦提交,永久改變資料表資料。

1.1.6 鎖機制

1Innodb預設是行鎖,但是如果在事務操作的過程中,沒有使用到索引,那麼系統會自動全表檢索資料,自動升級為表鎖。

2)行鎖:只有當前行被鎖住,別的使用者不能操作

3)表鎖:整張表被鎖住

 

2.變數

變數分為:系統變數和自定義變數

2.1 系統變數

系統定義的變數,大部分的時候使用者根本不需要使用系統變數,系統變數時用來控制伺服器的表現,如autocommitauto_increment

2.1.1 檢視系統變數

Show  variables; -- 檢視所有系統變數

檢視具體變數值:任何一個有資料返回的內容都是有select檢視

Select @@系統變數名;

2.2 修改系統變數

1)修改系統變數分為兩種方式:會話級別和全域性級別

2會話級別:臨時修改,當前客戶端當次連線有效

Set 變數名 = ;

Set @@變數名 = ;

(3)全域性級別:一次修改,永久生效(對所有客戶端都生效)

Set global 變數名;

注:如果其他客戶端當前已經連線上伺服器,那麼當次修改無效,要重新登入才會生效。

2.2 自定義變數

2.2.1 自定義變數

1)系統為了區分系統變數,規定使用者自定義變數必須使用一個@符號

Set @變數名 =/:= ;

2)自定義變數檢視

Select @變數名;

(3)mysql中,=會預設的當做比較符號處理,mysql為了區分比較和賦值的概念增加了一個賦值符號::=

(4)Mysql允許資料表中獲取資料,然後賦值給變數

方案1:邊賦值,邊檢視結果

程式碼:

select @name = name,name from my_student;

 

程式碼:

select @name := name,name from my_student;

select @name;

 

方案2:只有賦值不看結果(1)要求很嚴格(2)資料記錄最多隻允許一條(3Mysql不支援陣列

Select 欄位列表 from 表名 into 變數列表;

程式碼:

select name,age from my_student where id =2 into @name,@age;

效果:

 

5)所有自定義的變數都是會話級別:當前客戶端當次連線有效

6)所有自定義變數不區分資料庫(使用者級別)

3 觸發器

(1)觸發器(trigger):事先為了某張表繫結好一段程式碼,當表中的某些內容發生改變的時候(增刪改),系統會自動觸發程式碼執行。

(2)觸發器:事情型別,觸發時間,觸發物件

1)事件型別:增刪改,三種類型(insertdeleteupdate

2)觸發時間:前後(beforeafter

3)觸發物件:表中的每一條記錄(行)

(3)一張表中只能擁有一種觸發時間的一種型別的觸發器(不重複),即一張表最多能有6個觸發器。

3.1建立觸發器

1)在mysql高階結構中,沒有大括號,都是對應的字元符號代替

2)觸發器基本語法

-- 臨時修改語句結束符

Delimiter 自定義符號 --後續程式碼中只有碰到自定義符號才算結束

Create trigger 觸發器名字 觸發時間 事件型別 on for each row

Begin  -- 代表左大括號:開始

-- 裡面就是觸發器的內容,每行內容都必須使用語句結束符:分號

End    --代表右大括號:結束

自定義符號  -- 語句結束符

-- 將臨時修改修正過來

Delimiter ;

程式碼:

-- 觸發器:訂單生成一個,商品庫存減少一個

delimiter $$

create trigger after_order after insert on my_order for each row

begin

 -- 觸發器開始內容

 update my_goods set inv = inv-1 where id = 2;

 end

 $$

 delimiter ;

 

3.2 檢視觸發器

1)檢視所有觸發器:show triggers [like pattern];

 

(2)可以檢視觸發器建立語句

Show create trigger 觸發器名字;

 

(3)所有的觸發器都會儲存一張表:information_schema triggers;

3.3 使用觸發器

觸發器:不需要手動呼叫,而是當某種情況發生時回自動觸發。

3.4 修改觸發器&刪除觸發器

Drop trigger 觸發器名;

3.5 觸發器記錄

(1)觸發器記錄:不管觸發器是否觸發了,只要當某種操作準備執行,系統就會將“當前要操作的記錄的當前狀態”和“即將執行之後的新狀態”分別保留下來,供觸發器使用。其中,要操作的當前狀態儲存到old中,操作之後的可能形態儲存給new

(2)Old代表的是舊記錄,new代表的是新記錄

刪除的時候是沒有new;

插入的時候是沒有old;

3Oldnew都是代表記錄本身:任何一條記錄除了有資料,還有欄位名字。

4)使用方式:old 欄位名/ new 欄位名;

-- 觸發器:訂單生成,商品庫存減少

delimiter $$

create trigger after_order after insert on my_order for each row

begin

 -- 觸發器開始內容

 update my_goods set inv = inv-new.g_number where id = new.g_id;

 end

 $$

 delimiter ;

4.程式碼執行結構

程式碼執行三種結構:順序結構,分支結構和迴圈結構

4.1 分支結構

(1)分子結構:事先準備多個程式碼塊,按照條件選擇性執行某段程式碼塊

(2)If分支基本語法:

If 條件判斷 then

   -- 滿足條件執行的程式碼

Else

-- 不滿足條件執行的程式碼

End if

4.2 迴圈結構

(1)迴圈結構:某段程式碼在指定條件執行重複迴圈

(2)基本語法(while迴圈,沒有for迴圈)

While 條件判斷 do

 -- 滿足條件要執行的迴圈程式碼

 -- 變更迴圈條件

End while;

(3)迴圈控制:在迴圈內部進行迴圈判斷和控制

Mysql中沒有對應continuebreak,但是有替代品

Iterate:迭代,型別continue:後面的程式碼不執行,迴圈重新來

Leave:離開,類似break

(4)使用方式:iterate/leave 迴圈名字

-- 定義迴圈名字

迴圈名字:while 條件 do

-- 迴圈體

-- 迴圈控制

Leave/iterate 迴圈名字;

End while;

5.函式

將一段程式碼塊封裝到一個結構中,在需要執行程式碼塊的時候,呼叫結構執行即可(程式碼複用)

5.1 系統函式

1)系統定義好的函式,直接呼叫即可。

2)任何函式都有返回值,因此函式的呼叫時通過select呼叫。

3Mysql中,字串的基本操作單位(最常見的是字元)

1Substring 字串擷取

set @cn = '世界你好';

set @en = 'hello world';

-- 字串擷取

select substring(@cn,1,1);

select substring(@en,1,1);

 

2Char_length:字元長度

Length:位元組長度

select char_length(@cn),char_length(@en),length(@cn),length(@en);

 

3Instr:判斷字串是否在某個具體的字串中存在,存在返回位置

 

4)Lpad:左填充,將字串按照某個指定的填充方式,填充到指定長度(字元)

select lpad(@cn,20,'歡迎'),lpad(@en,20,'hello');

 

5Insert:替換,找到指定長度的字串,替換成目標字串

6Strcmpcompare,字串比較

5.2 自定義函式

函式要素:函式名,引數列表(形參和實參),返回值,函式體(作用域)

5.2.1 建立函式

(1)建立語法:

Create function 函式名([引數列表]) returns 資料型別 --規定返回資料型別

Begin

-- 函式體

-- 返回值:return型別(指定資料型別)

End

(2)自定義函式與系統函式呼叫方式是一樣:select 函式名(實參列表)

5.2.2 檢視函式

檢視所有函式:show function status [like patren];

檢視函式的建立語句:show create function 函式名;

5.2.3 修改函式&刪除函式

1)函式只能先刪除後新增,不能修改。

Drop function 函式名;

5.2.4 函式引數

(1)引數分為兩種:定義時的引數叫做形參,呼叫時的引數叫實參(實參可以是數值也可以變數)。形參:要求必須指定資料型別。

Function 函式名(形參名字 欄位型別)returns 資料型別

(2)在函式內部使用@定義的變數在函式外部也可以訪問。

 

5.2.5 作用域

1Mysql中的作用域與js中的作用域完全一樣

2)全域性變數可以在任何地方使用;區域性變數只能在函式內部使用。

3全域性變數:使用set關鍵字定義,使用@符號標誌

4區域性變數:使用declare關鍵字宣告,沒有@符號;所有的區域性變數的宣告,必須在函式體的開始之前定義。

delimiter @@

create function display3(int_1 int) returns int

begin

     -- 定義區域性變數

declare res int default 0;

declare num int default 1;

-- 迴圈判斷

while num <= int_1 do

if num%5!=0 then

-- 相加

set res = res + num;

end if;

-- 改變迴圈變數

set num = num + 1;

end while;

return res;

end

@@

delimiter ;

 

6 儲存過程

儲存過程簡稱過程(procedure),是一種用來處理資料的方式。

儲存過程是一種沒有返回值的函式。

6.1 建立過程

Create procedure 過程名字([引數列表]

Begin

-- 過程體

End

6.2 檢視過程

檢視所有過程:show procedure status [like patern];

6.3 呼叫過程

Call 過程名;

6.4 修改過程&刪除過程

過程只能先刪除,後新增

Drop procedure 過程名;

6.5 過程引數

1)函式的引數需要資料型別指定,過程比函式更嚴格。過程有自己的型別限定:三種類型

1In:資料只是從外部傳入給內部使用(值傳遞,變數或數值)

2Out:只允許過程內部使用(不用外部資料),給外部使用的只能是變數(引用傳遞:外部的資料會被先清空再進入到內部)

3Inout:外部可以在內部使用,內部修改液可以給外部使用(典型的引用傳遞:只能傳變數)

2)基本使用

Create procedure 過程名(in 形參名字 資料型別,out 形參名字 資料型別,inout 形參名字 資料型別)

 

(3)呼叫:outinout傳入的必須是變數

4)儲存過程對於變數的操作(返回)是滯後的:是在儲存過程呼叫結束的時候,才會重新將內部修改的值(傳入的變數)賦值給外部傳入的全域性變數、