1.查看表的定義
show create table 表名稱证芭;
2.查看表中每一個字段的定義(包括校對規(guī)則)
show full columns from 表名稱;
3.并行事務(wù)處理帶來的問題
- 更新丟失:T1和T2讀取同一行,T1修改寫入拧粪,T2再修改寫入,T1的修改(更新)丟失(鎖定正在讀取的行可以解決)
- 臟讀:T1讀完沧侥,T1修改可霎,在提交之前,數(shù)據(jù)處于不一致狀態(tài)宴杀;T2讀癣朗,T1提交(修改生效),T2讀的是錯誤數(shù)據(jù)(鎖定正在讀取的行可以解決)
- 不可重復(fù)讀:T1讀完未提交旺罢,T2更改生效旷余,T1再確認,T1發(fā)現(xiàn)兩次讀取的值不一樣(鎖定所讀取的所有行可以解決)
- 幻讀:T1執(zhí)行查詢操作扁达,未提交正卧,T2插入或刪除了一些數(shù)據(jù)生效,T1按相同的查詢條件再次查詢跪解,T1發(fā)現(xiàn)兩次查詢結(jié)果不一致炉旷,就好像幻覺一樣。(鎖定表可以解決)
4.解決隔離和并發(fā)的矛盾
數(shù)據(jù)庫的事務(wù)隔離越嚴格叉讥,并發(fā)副作用越小砾跃,但并發(fā)訪問的能力下降,為了解決隔離和并發(fā)的矛盾节吮,可以根據(jù)自己的業(yè)務(wù)需要,選擇合適的隔離級別:
- 未提交讀:會出現(xiàn)臟讀判耕、不可重復(fù)讀透绩、幻讀 ( 隔離級別最低,并發(fā)性能高 )
- 已提交讀:鎖定正在讀取的行,會出現(xiàn)不可重復(fù)讀帚豪、幻讀
- 可重復(fù)讀:鎖定所讀取的所有行碳竟,會出現(xiàn)幻讀
- 可序列化:鎖定表,所有情況均不會發(fā)生
5.觸發(fā)器三要素:
- 事件類型:增刪改(insert狸臣、delete和update)莹桅;
- 觸發(fā)時間:事件類型前和后,即before和after烛亦;
-- before:在增刪改之前執(zhí)行觸發(fā)內(nèi)容主體
-- after:在增刪改成功之后執(zhí)行觸發(fā)內(nèi)容主體 - 觸發(fā)對象:表中的每一條記錄(行)诈泼,即整張表(for each row )
6.創(chuàng)建觸發(fā)器:
delimiter $$(將命令結(jié)束符設(shè)定為$$)
create trigger 觸發(fā)器名稱 after/before insert/delete/update on 表名 for each row
begin
觸發(fā)內(nèi)容主體(每行用分號結(jié)尾);
end
$$
delimiter;(將命令結(jié)束符重新設(shè)定為;)
7.查看觸發(fā)器
show triggers\G
show create trigger 觸發(fā)器名稱 \G
\G會將結(jié)果旋轉(zhuǎn)90°煤禽,以便查看铐达。在navicat中使用 \G會導(dǎo)致語法錯誤
select * from information_schema.triggers where trigger_name='觸發(fā)器名稱'\G
8.觸發(fā)器記錄
- OLD:舊記錄,即當前記錄的狀態(tài)(觸發(fā)器未觸發(fā)之前的記錄)檬果,插入時沒有OLD瓮孙;
- NEW:新記錄,即假設(shè)操作發(fā)生之后記錄的狀態(tài)选脊,刪除時沒有NEW杭抠。
當在觸發(fā)內(nèi)容主體中需要用到(觸發(fā)器創(chuàng)建的)表中某個字段的新/舊記錄時
OLD/NEW.字段名
9.分支結(jié)構(gòu)
if 條件判斷 then
-- 滿足條件時,要執(zhí)行的代碼
else -- 可以沒有 else 語句
-- 不滿足條件時恳啥,要執(zhí)行的代碼
end if;
9.循環(huán)結(jié)構(gòu)
循環(huán)名稱: while 條件判斷 do
-- 滿足條件時要執(zhí)行的代碼
-- 變更循環(huán)條件
iterate/leave 循環(huán)名稱; -- 控制循環(huán)語句(繼續(xù)循環(huán)/結(jié)束循環(huán))
end while;
10.主鍵沖突的兩種解決方法
在一個定義了主鍵的表中插入新紀錄偏灿,如果主鍵對應(yīng)的值已存在,就會插入失敗
1062 - Duplicate entry '2' for key 'PRIMARY'
這就是主鍵沖突角寸,如何對主鍵已經(jīng)存在的記錄進行更改呢菩混?
- 第一種方法:更新
insert into 表名[(字段列表:包含主鍵)] values (值列表)
on duplicate key
update 字段 = 新值;
- 第二種方法:替換(更簡便)
replace into 表名[(字段列表:包含主鍵)] values (值列表);