事務:
通俗的說事務: 指一組操作,要麼都成功執行,要麼都不執行.---->原子性
在所有的操作沒有執行完畢之前,其他會話不能夠看到中間改變的過程-->隔離性
事務發生前,和發生後,數據的總額依然匹配----->一致性
事務產生的影響不能夠撤消------>持久性
如果出了錯誤,事務也不允許撤消, 只能通過"補償性事務"
轉賬
李三: --->支出 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函數