事務: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函數