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

事務:mysql

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

在全部的操做沒有執行完畢以前,其餘會話不可以看到中間改變的過程-->隔離性編程

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

事務產生的影響不可以撤消------>持久性大數據

若是出了錯誤,事務也不容許撤消只能經過"補償性事務"spa

轉帳事件

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

趙四: ---->收到500, 趙四 +500權限控制

關於事務的引擎:it

選用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函數

相關文章
相關標籤/搜索