mysql事務、觸發器、視圖、存儲過程、函數

事務:

通俗的說事務指一組操作,要麼都成功執行,要麼都不執行.---->原子性

在所有的操作沒有執行完畢之前,其他會話不能夠看到中間改變的過程-->隔離性

事務發生前,和發生後,數據的總額依然匹配----->一致性

事務產生的影響不能夠撤消------>持久性

如果出了錯誤,事務也不允許撤消只能通過"補償性事務"

轉賬

李三: --->支出 500, 李三 -500

趙四: ---->收到500, 趙四 +500

關於事務的引擎:

選用innodb /bdb

開啓事務:  start transaction;

Sql....

Sql....

Commit 提交

rollback 回滾

注意當一個事務commit,或者rollback就結束了

注意:有一些語句會造成事務的隱式的提交,比如 start transaction

事務 的基本原理 (瞭解)



觸發器:trigger, 槍擊,扳擊,引線的意思

一觸即發,

作用監視某種情況並觸發某種操作.

觀察以下場景:

一個電子商城,

商品表,  g

主鍵

商品名

庫存

1

電腦

28

2

自行車

12

訂單表, o

訂單主鍵

商品外鍵

購買數量

1

2

3

2

1

5

完成下單與減少庫存的邏輯

Insert into o (gid,num) values (2,3);  // 插入語句

Update g set goods_num = goods_num - 3 where id = 2;// 更新過程

這兩個邏輯可以看成一個整體,或者說, insert ---> 引來 update

用觸發器可以解決上述問題.

我們可以監視某表的變化,當發生某種變化時,觸發某個操作.

觸發器: 

能監視,,

觸發操作,,

四要素:

監視地點

監視事件

觸發時間

觸發事件

創建觸發器的語法

Create trigger triggerName 

After/before insert/update/delete  on 表名

For each row #這句話是固定的

Begin

Sql語句;  # 一句或多句,insert/update/delete範圍內

End;

刪除觸發器的語法:

Drop trigger 觸發器名

查看觸發器

Show triggers

如何在觸發器引用行的值

對於insert而言新增的行 用new 來表示,

行中的每一列的值 ,new.列名來表示.

對於 delete來說原本有一行,後來被刪除,

想引用被刪除的這一行,old,來表示,  old.列名,就可以引用被刪行中的值.

對於update來說,

被修改的行

修改前的數據 ,用 old來表示old.列名引用被修改之前行中的值

修改後的數據,new 來表示new.列名引用被修改之後行中的值






視圖: view

查詢每個欄目最貴商品 --->

Select goods_id,goods_name,shop_price from goods order by cat_id asc ,shop_price desc

查詢結果 當成一張表看

如果某個查詢結果出現的非常頻繁,也就是,拿這個結果當做進行子查詢出現的非常頻繁,

Create table g2 like goods;

Insert into g2 select ........

上面兩句,是想保存一個查詢結果到表裏面供其他查詢用.

視圖的定義:

視圖是由查詢結果形成的一張虛擬表.

視圖的創建語法:

Create view 視圖名 as  select 語句;

視圖的刪除語法:

Drop view 

爲什麼要視圖?

:1:可以簡化查詢

2: 可以進行權限控制

把表的權限封閉,但是開放相應的視圖權限,視圖裏只開放部分數據

3: 大數據分表時可以用到

比如,表的行數超過200萬行時,就會變慢,

可以把一張的表的數據拆成4張表來存放

News

Newsid, 1,2,3,4

News1,news2,news3,news4

把一張表的數據分散到4張表裏,分散的方法很多,

最常用可以用id取模來計算

Id%4+1 = [1,2,3,4]

比如 $_GET['id'] = 17,

17%4 + 1 = 2,  $tableName = 'news'.'2'

Select * from news2 where id = 17;

還可以用視圖4張表形成一張視圖

Create view news as  select from n1 union select from n2 union.........

視圖的修改

Alter view as select xxxxxx

視圖與表的關係

視圖是表的查詢結果,自然表的數據改變了,影響視圖的結果.

視圖改變了呢?

0: 視圖增刪改也會影響表

1: 但是,視圖並是總是能增刪改的.

視圖的數據與表的數據 一一對應時,可以修改.

對於視圖insert還應注意,

視圖必須包含表中沒有默認值的列

視圖的algorithm

Algorithm = merge/ temptable/ undefined

Merge: 當引用視圖時,引用視圖的語句與定義視圖的語句合併.

Temptable:當引用視圖時,根據視圖的創建語句建立一個臨時表

Undefined:未定義,自動,讓系統幫你選.

Merge,意味着視圖只是一個規則,語句規則當查詢視圖時,

把查詢視圖的語句(比如where那些)與創建時的語句where子句等合併,分析.

形成一條select 語句.

創建視圖的語句:

mysql> create view g2 as select goods_id,cat_id,goods_name,shop_price from goods order by cat_id asc,shop_price desc;

查詢視圖的語句:

 select * from g2 group by cat_id;

最終執行的語句:

select goods_id,cat_id,goods_name,shop_price from goods group by cat_id order by cat_id asc,shop_price desc;

temptable是根據創建語句瞬間創建一張臨時表,

然後查詢視圖的語句從該臨時表查數據.

create altorethm=temptable view g2 as select goods_id,cat_id,goods_name,shop_price from goods order by cat_id asc,shop_price desc;

查詢視圖的語句:

 select * from g2 group by cat_id;

最終執行的2句話取數據並放在臨時表,然後去查臨時表.


存儲過程: procedure

概念類似於函數,就是把一段代碼封裝起來,

當要執行這一段代碼的時候,可以通過調用該存儲過程來實現.

在封裝的語句體裏面,可以用if/else, case,while等控制結構.

可以進行sql編程.

查看現有的存儲過程:

Show procedure status

刪除存儲過程

Drop procedure 存儲過程的名字

調用存儲過程

Call 存儲過程名字();

1個存儲過程 ,體會"封裝sql"


2個存儲過程體會"參數"


3個存儲過程,體會"控制結構"


4個存儲過程,體會"循環"


mysql,存儲過程和函數的區別,

一個是名稱不同,

二個就是存儲過程沒有返回值.


mysql函數



發佈了46 篇原創文章 · 獲贊 8 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章