數(shù)據(jù)庫(kù)知識(shí)點(diǎn)總結(jié)

一、 left join挎扰, right join氓轰, inner join區(qū)別峰伙?

  • left join(左聯(lián)接) 返回包括左表中的所有記錄和右表中聯(lián)結(jié)字段相等的記錄
  • right join(右聯(lián)接) 返回包括右表中的所有記錄和左表中聯(lián)結(jié)字段相等的記錄
  • inner join(等值連接) 只返回兩個(gè)表中聯(lián)結(jié)字段相等的行

注意:在某些數(shù)據(jù)庫(kù)中l(wèi)eft join等同于left outer join

舉個(gè)例子:
表A記錄如下

aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115

表B記錄如下

bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408



1、sql語(yǔ)句如下:

select * from A
left join B
on A.aID = B.bID

結(jié)果如下:

aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL

(所影響的行數(shù)為5行)
結(jié)果說(shuō)明:
left join是以A表的記錄為基礎(chǔ)的,A可以看成左表住练,B可以看成右表地啰,left join是以左表為準(zhǔn)的。換句話說(shuō)讲逛,左表(A)的記錄將會(huì)全部表示出來(lái)亏吝,而右表(B)只會(huì)顯示符合搜索條件的記錄(例子中為:A.aID = B.bID)。B表記錄不足的地方均為NULL盏混。

2蔚鸥、sql語(yǔ)句如下:

select * from A
right join B
on A.aID =B.bID

結(jié)果如下:

aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408

(所影響的行數(shù)為5行)
結(jié)果說(shuō)明
仔細(xì)觀察一下,就會(huì)發(fā)現(xiàn)许赃,和left join的結(jié)果剛好相反止喷,這次是以右表(B)為基礎(chǔ)的,A表不足的地方用NULL填充混聊。

3弹谁、sql語(yǔ)句如下:

select * from A
inner join B
on A.aID = B.bID

結(jié)果如下:

aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404

結(jié)果說(shuō)明:
很明顯,這里只顯示出了A.aID = B.bID的記錄句喜,這說(shuō)明inner join并不以誰(shuí)為基礎(chǔ)预愤,它只顯示符合條件的記錄。

二咳胃、 存儲(chǔ)引擎MyIsam和Innodb區(qū)別植康?

(1)MyIsam類型不支持事務(wù)處理等高級(jí)處理,而Innodb類型支持
事務(wù)處理是指原子性操作拙绊。例如向图,支持事務(wù)處理的Innodb表中,你發(fā)了一個(gè)帖子執(zhí)行insert語(yǔ)句标沪,來(lái)插入帖子內(nèi)容榄攀,插入后要執(zhí)行一個(gè)update語(yǔ)句來(lái)增加你的積分。假設(shè)一種特殊情況突然發(fā)生金句,insert成功了檩赢,update操作卻沒(méi)有被執(zhí)行。也就是說(shuō)你發(fā)了帖子卻沒(méi)有增加相應(yīng)的積分违寞。這就會(huì)造成用戶不滿贞瞒。如果使用了事務(wù)處理,insert和update都放入到事務(wù)中去執(zhí)行趁曼,這個(gè)時(shí)候军浆,只有當(dāng)insert和update兩條語(yǔ)句都執(zhí)行生成的時(shí)候才會(huì)將數(shù)據(jù)更新、寫(xiě)入到表中挡闰。如果其中任何一條語(yǔ)句失敗乒融,那么就會(huì)回滾為初始狀態(tài)掰盘,不執(zhí)行寫(xiě)入。這樣就保證了insert和update肯定是一同執(zhí)行的赞季。

(2)MyIsam表不支持外鍵愧捕。innodb支持外鍵

(3)在執(zhí)行數(shù)據(jù)寫(xiě)入的操作(insert,update,delete)的時(shí)候,MyIsam表會(huì)鎖表申钩,而innodb表會(huì)鎖行次绘。
通俗的講,就是你執(zhí)行一個(gè)update語(yǔ)句撒遣,那么MyIsam表會(huì)將整個(gè)表都鎖住邮偎,其他的insert和delete、update都會(huì)被拒之門(mén)外愉舔,等到這個(gè)update語(yǔ)句執(zhí)行完成后才會(huì)被依次執(zhí)行钢猛。而鎖行,就是說(shuō)轩缤,你執(zhí)行update語(yǔ)句時(shí)命迈,只會(huì)將這一條記錄進(jìn)行鎖定,只有針對(duì)這條記錄的其他寫(xiě)入火的、更新操作會(huì)被阻塞并等待這條update語(yǔ)句執(zhí)行完畢后再執(zhí)行壶愤,針對(duì)其他記錄的寫(xiě)入操作不會(huì)有影響。但是innodb表的行鎖也不是絕對(duì)的馏鹤,如果在執(zhí)行一個(gè)sql語(yǔ)句時(shí)征椒,mysql不能確定要掃描的范圍,innodb表同樣會(huì)鎖全表湃累,例如update table set num =1 where name like “%aaa%”

(4)表的具體行數(shù)
select count(*) from table , MyIsam只要簡(jiǎn)單的讀出保存好的行數(shù)勃救,注意的是,當(dāng)count(*)語(yǔ)句包含where條件時(shí)治力,兩種表的操作是一樣的蒙秒。
innodb中不保存表的具體行數(shù),也就是說(shuō)宵统,執(zhí)行select count(*) from table時(shí)晕讲,innodb要掃描一遍整個(gè)表來(lái)計(jì)算有多少行。

總結(jié)
因此马澈,當(dāng)你的數(shù)據(jù)庫(kù)有大量的寫(xiě)入瓢省、更新操作而查詢比較少或者數(shù)據(jù)完整性要求比較高的時(shí)候就選擇innodb表。當(dāng)你的數(shù)據(jù)庫(kù)主要以查詢?yōu)橹魅啵啾容^而言更新和寫(xiě)入比較少勤婚,并且業(yè)務(wù)方面數(shù)據(jù)完整性要求不那么嚴(yán)格,就選擇myisam表涤伐。因?yàn)镸yIsam表的查詢操作效率和速度都比innodb要快蛔六。

InnoDB的設(shè)計(jì)目標(biāo)是處理大容量數(shù)據(jù)庫(kù)系統(tǒng)荆永,它的CPU利用率是其它基于磁盤(pán)的關(guān)系數(shù)據(jù)庫(kù)引擎所不能比的废亭。

我覺(jué)得使用InnoDB可以應(yīng)對(duì)更為復(fù)雜的情況国章,特別是對(duì)并發(fā)的處理要比MyISAM高效。同時(shí)結(jié)合memcache也可以緩存SELECT來(lái)減少SELECT查詢豆村,從而提高整體性能液兽。

使用以下mysql sql語(yǔ)句,可以給表設(shè)定數(shù)據(jù)庫(kù)引擎:

ALTER TABLE `wp_posts` ENGINE = MyISAM;

查看當(dāng)前數(shù)據(jù)庫(kù)的引擎掌动,可看出默認(rèn)是InnoDB類型四啰。

三、 mysql的優(yōu)化手段有哪些粗恢?

MYSQL數(shù)據(jù)庫(kù)優(yōu)化的八種方式:
(1)選取最適用的字段屬性
MYSQL可以很好的支持大數(shù)據(jù)量的存取柑晒,但是一般來(lái)說(shuō),數(shù)據(jù)庫(kù)中的表越小眷射,在它上面執(zhí)行的查詢也就會(huì)越快匙赞。因此,在創(chuàng)建表的時(shí)候妖碉,為了獲得更好的性能涌庭,我們可以將表中字段的寬度設(shè)得盡可能小。
例如欧宜,在定義郵政編碼這個(gè)字段時(shí)坐榆,如果將其設(shè)置為CHAR(255),顯然給數(shù)據(jù)庫(kù)增加了不必要的空間冗茸,甚至使用VARCHAR這種類型也是多余的席镀,因?yàn)镃HAR(6)就可以很好的完成任務(wù)了。同樣的夏漱,如果可以的話豪诲,我們應(yīng)該使用MEDIUMINT而不是BIGINT來(lái)定義整型字段。
另外一個(gè)提高效率的方法是在可能的情況下麻蹋,應(yīng)該盡量把字段設(shè)置為NOT NULL跛溉,這樣在將來(lái)執(zhí)行查詢的時(shí)候,數(shù)據(jù)庫(kù)不用去比較NULL值扮授。
對(duì)于某些文本字段芳室,例如“省份”或者“性別”,我們可以將它們定義為ENUM類型刹勃。因?yàn)樵贛YSQL中堪侯,ENUM類型被當(dāng)做數(shù)值型數(shù)據(jù)來(lái)處理,而數(shù)值型數(shù)據(jù)被處理起來(lái)的速度要比文本類型快得多荔仁。這樣伍宦,我們又可以提高數(shù)據(jù)庫(kù)的性能芽死。

(2)使用連接(JOIN)來(lái)代替子查詢(Sub-Queries)
例如:我們要將客戶基本信息表中沒(méi)有任何訂單的客戶刪除掉,就可以利用子查詢先從銷(xiāo)售信息表中將所有發(fā)出訂單的客戶ID取出來(lái)次洼,然后將結(jié)果傳遞給主查詢关贵,如下所示:

SELECT* FROM customerinfo
WHERE customerID NOT in (SELECT customerid FROM salesinfo)

如果使用連接(JOIN)來(lái)完成這個(gè)查詢工作,速度將會(huì)快很多卖毁。尤其是當(dāng)salesinfo表中對(duì)CustomerID建有索引的話揖曾,性能將會(huì)更好。查詢?nèi)缦拢?br> SELECT * FROM customerinfo
LEFT JOIN salesinfo ON customerinfo.customerid = salesinfo.customerif
Where salesinfo.customerid is NULL

連接(JOIN)之所以更有效率一些亥啦,是因?yàn)镸YSQL不需要在內(nèi)存中創(chuàng)建臨時(shí)表來(lái)完成這個(gè)邏輯上的需要兩個(gè)步驟的查詢工作炭剪。

(3)使用聯(lián)合(UNION)來(lái)代替手動(dòng)創(chuàng)建的臨時(shí)表
UNION查詢可以把需要使用臨時(shí)表的兩條或更多的select查詢合并在一個(gè)查詢中。在客戶端的查詢會(huì)話結(jié)束的時(shí)候翔脱,臨時(shí)表會(huì)被自動(dòng)刪除奴拦,從而保證數(shù)據(jù)庫(kù)整齊、高效届吁。使用union來(lái)創(chuàng)建查詢的時(shí)候错妖,我們只需要用union作為關(guān)鍵字把多個(gè)select語(yǔ)句連接起來(lái)就可以了,要注意的是所有select語(yǔ)句中的字段數(shù)目要相同瓷产。
例子:

Select name, phone from client union
Select name, birthdate from author union
Select name, supplier from product

(4)事務(wù)
盡管我們可以使用子查詢站玄、連接(join)和聯(lián)合(union)來(lái)創(chuàng)建各種各樣的查詢,但不是所有的數(shù)據(jù)庫(kù)操作都可以只用一條或少數(shù)幾條sql語(yǔ)句就可以完成的濒旦。更多的時(shí)候是需要用到一系列的語(yǔ)句來(lái)完成某種工作株旷。但是如果這個(gè)語(yǔ)句塊中的某一條語(yǔ)句運(yùn)行出錯(cuò)的時(shí)候,整個(gè)語(yǔ)句塊的操作就會(huì)變得不確定起來(lái)尔邓。因此要盡量使用事務(wù)晾剖,它的作用:要么語(yǔ)句塊中每條語(yǔ)句都操作成功,要么都失敗梯嗽。換句話說(shuō)齿尽,就是可以保持?jǐn)?shù)據(jù)庫(kù)中數(shù)據(jù)的一致性和完整性。事務(wù)以BEGIN關(guān)鍵字開(kāi)始灯节,COMMIT關(guān)鍵字結(jié)束兔甘。在這之間的一條SQL操作失敗拆讯,那么曼验,rollback命令就可以把數(shù)據(jù)庫(kù)恢復(fù)到BEGIN開(kāi)始之前的狀態(tài)勾拉。
例子:

BEGIN:
    INSERT INTO  salesinfo SET customerid = 14;
    UPDATE inventory SET quantity = 11 WHERE item=‘book’;
COMMIT;

事務(wù)的另一個(gè)重要作用是當(dāng)多個(gè)用戶同時(shí)使用相同的數(shù)據(jù)源時(shí),它可以利用鎖定數(shù)據(jù)庫(kù)的方法來(lái)為用戶提供一種安全的訪問(wèn)方式形入,這樣可以保證用戶的操作不被其他的用戶所干擾全跨。

(5)鎖定表
通過(guò)鎖定表來(lái)防止其他的訪問(wèn)對(duì)我們正在操作的表進(jìn)行插入、更新或者刪除的操作亿遂。
例子:

LOCK TABLE inventory WRITE SELECT quantity FROM inventory WHERE item=‘book’;
…
UPDATE inventory SET Quantity=11 WHERE Item=‘book’; UNLOCKTABLES

這里浓若,我們用一個(gè)select語(yǔ)句取出初始數(shù)據(jù)渺杉,通過(guò)一些計(jì)算,用update語(yǔ)句將新值更新到表中挪钓。包含有WRITE關(guān)鍵字的LOCKTABLE語(yǔ)句可以保證在UNLOCKTABLES命令被執(zhí)行之前是越,不會(huì)有其他的訪問(wèn)來(lái)對(duì)inventory進(jìn)行插入、更新或者刪除的操作诵原。

(6)使用外鍵
鎖定表的方法可以維護(hù)數(shù)據(jù)的完整性英妓,但是它卻不能保證數(shù)據(jù)的關(guān)聯(lián)性。這個(gè)時(shí)候我們就可以使用外鍵绍赛。

(7)使用索引
索引是提高數(shù)據(jù)庫(kù)性能的常用方法,它可以令數(shù)據(jù)庫(kù)服務(wù)器以比沒(méi)有索引快得多的速度檢索特定的行辑畦,尤其是在查詢語(yǔ)句當(dāng)中包含有MAX()吗蚌,MIN()和ORDERBY這些命令的時(shí)候,性能提高更為明顯纯出。
對(duì)哪些字段建立索引蚯妇?
索引應(yīng)建立在那些將用于JOIN,WHERE判斷和ORDERBY排序的字段上暂筝。
全文索引在MYSQL中是一個(gè)FULLTEXT類型索引箩言,但僅能用于MYISAM類型的表。對(duì)于一個(gè)大的數(shù)據(jù)庫(kù)焕襟,將數(shù)據(jù)裝載到一個(gè)沒(méi)有FULLTEXT索引的表中陨收,然后再使用ALTERTABLE或CREATEINDEX創(chuàng)建索引,將是非惩依担快的务漩。但如果將數(shù)據(jù)裝載到一個(gè)已經(jīng)有FULLTEXT索引的表中,執(zhí)行過(guò)程將會(huì)非常慢它褪。

(8)優(yōu)化查詢語(yǔ)句
1饵骨、最好在相同類型的字段間進(jìn)行比較的操作
2、在建有索引的字段上盡量不要使用函數(shù)進(jìn)行操作茫打。
例如居触,在一個(gè)DATE類型的字段上使用YEAR()函數(shù)時(shí),將會(huì)使索引不能發(fā)揮應(yīng)有的作用老赤。所以下面的兩個(gè)查詢雖然返回的結(jié)果一樣轮洋,但后者要比前者快的多。
3诗越、在搜索字符型字段時(shí)砖瞧,我們有時(shí)會(huì)使用LIKE關(guān)鍵字和通配符,這種做法雖然簡(jiǎn)單嚷狞,但卻也是以犧牲系統(tǒng)性能為代價(jià)的块促。
例如下面的查詢將會(huì)比較表中的每一條記錄

SELECT * FROM books WHERE name like “MYSQL%”

但是如果換用下面的查詢荣堰,返回的結(jié)果一樣,但速度就要快上很多

SELECT * FROM books WEHRE name>=“MYSQL” and name < “MYSQM”

最后竭翠,應(yīng)該注意避免在查詢中讓MYSQL進(jìn)行自動(dòng)類型轉(zhuǎn)換振坚,因?yàn)檗D(zhuǎn)換過(guò)程也會(huì)使索引變得不起作用。

四斋扰、 如何查看Mysql執(zhí)行計(jì)劃渡八?

mysql的查看執(zhí)行計(jì)劃的語(yǔ)句:explain+你要執(zhí)行的sql語(yǔ)句
例如:


id是一組數(shù)字,表示查詢中執(zhí)行select子句或操作表的順序传货。id如果相同屎鳍,則可以認(rèn)為是一組,從上往下順序執(zhí)行问裕,所有組中逮壁,id越高,優(yōu)先級(jí)越高粮宛,越容易執(zhí)行窥淆。
select_type有simple,primary,subquery,derived(衍生),union,unionresult.
simple表示查詢中不包含子查詢或者union。
當(dāng)查詢中包含任何復(fù)雜的子部分巍杈,最外層的查詢被標(biāo)記成primary忧饭。在select或where列表中包含了子查詢,則子查詢被標(biāo)記成subquery筷畦。在from的列表中包含的子查詢被標(biāo)記成derived词裤。....省略
參考網(wǎng)址:
http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html

mysql執(zhí)行計(jì)劃的局限

  1. explain不會(huì)告訴你關(guān)于觸發(fā)器、存儲(chǔ)過(guò)程的信息或用戶自定義函數(shù)對(duì)查詢的影響情況汁咏。
  2. explain不考慮各種cache
  3. explain不能顯示mysql在執(zhí)行查詢時(shí)所做的優(yōu)化工作
  4. 部分統(tǒng)計(jì)信息是估算的亚斋,并非精確值
  5. explain只能解釋select操作,其他操作要重寫(xiě)為select后查看執(zhí)行計(jì)劃攘滩。

五帅刊、 索引是什么? 有什么用漂问? 如何建立赖瞒? 索引的底層實(shí)現(xiàn)是什么? 什么情況下適合建立索引蚤假, 什么情況下不適合建立索引栏饮?

(1)什么索引?
數(shù)據(jù)庫(kù)索引磷仰,是幫助數(shù)據(jù)庫(kù)系統(tǒng)高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)袍嬉,以協(xié)助快速查詢、更新數(shù)據(jù)庫(kù)表中數(shù)據(jù)。

(2)建立索引的目的伺通?
在數(shù)據(jù)庫(kù)系統(tǒng)中建立索引主要有以下作用:

  1. 大大加快數(shù)據(jù)的檢索速度(最主要原因箍土,)
  2. 保證數(shù)據(jù)記錄的唯一性(通過(guò)建立唯一性索引,可以保證數(shù)據(jù)庫(kù)中每一行數(shù)據(jù)的唯一性)
  3. 可以加速表和表之間的連接罐监,實(shí)現(xiàn)表與表之間的參照完整性
  4. 在使用order by吴藻、group by子句(分組和排序子句)進(jìn)行數(shù)據(jù)檢索時(shí),利用索引可以顯著減少分組和排序的時(shí)間弓柱。

(3)缺點(diǎn)

  1. 索引需要占物理內(nèi)存
  2. 當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加沟堡、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù)矢空,降低了數(shù)據(jù)的維護(hù)速度

(4)mysql是使用B+樹(shù)實(shí)現(xiàn)其索引結(jié)構(gòu)

(5)創(chuàng)建索引的辦法:

  1. 直接創(chuàng)建索引
    例如使用create index語(yǔ)句或者使用創(chuàng)建索引向?qū)?/li>
  2. 間接創(chuàng)建索引
    例如在表中定義主鍵約束或者唯一性鍵約束時(shí)航罗,同時(shí)也創(chuàng)建了索引。

當(dāng)在表中定義主鍵或者唯一性鍵約束時(shí)妇多,如果表中已經(jīng)有了使用create index語(yǔ)句創(chuàng)建的標(biāo)準(zhǔn)索引時(shí)伤哺,那么主鍵約束或者唯一性鍵約束創(chuàng)建的索引覆蓋以前創(chuàng)建的標(biāo)準(zhǔn)索引。也就是說(shuō)者祖,主鍵約束或者唯一性鍵約束創(chuàng)建的索引的優(yōu)先級(jí)高于使用create index語(yǔ)句創(chuàng)建的索引。

(6)幾種索引類型的比較
聚集索引:物理存儲(chǔ)按照索引排序(表中行的物理順序與鍵值的索引順序相同)绢彤,葉子結(jié)點(diǎn)即存儲(chǔ)了真實(shí)的數(shù)據(jù)行七问。
非聚集索引:物理存儲(chǔ)位置不按照索引排序,葉子結(jié)點(diǎn)包含索引字段值及指向數(shù)據(jù)頁(yè)數(shù)據(jù)行的邏輯指針茫舶。

一張表中只能創(chuàng)建一個(gè)聚集索引械巡,但表中的每一列都可以有自己的非聚集索引。

唯一性索引:這一列數(shù)據(jù)不重復(fù)饶氏,只能一個(gè)為NULL
主鍵索引:主鍵索引是唯一索引的特定類型讥耗。不重復(fù),不允許為空疹启。主鍵只能有一個(gè)古程。
普通索引:create index等建立的索引,alter tablename add index ...

(7) 外鍵約束的要求:

  1. 父表和子表必須使用相同的存儲(chǔ)引擎喊崖,而且禁止使用臨時(shí)表挣磨。
  2. 數(shù)據(jù)表的存儲(chǔ)引擎只能為InnoDB。
  3. 外鍵列和參照列必須具有相似的數(shù)據(jù)類型荤懂。其中數(shù)字的長(zhǎng)度或是否有符號(hào)位必須相同茁裙;而字符的長(zhǎng)度則可以不同。
  4. 外鍵列和參照列必須創(chuàng)建索引节仿。如果外鍵列不存在索引的話晤锥,MySQL將自動(dòng)創(chuàng)建索引。

六廊宪、 什么是存儲(chǔ)過(guò)程矾瘾?有什么好處女轿?

(1)什么是存儲(chǔ)過(guò)程?
存儲(chǔ)過(guò)程是一個(gè)被定義并保存在數(shù)據(jù)庫(kù)服務(wù)器中的sql語(yǔ)句集霜威,是一種介于應(yīng)用程序和數(shù)據(jù)庫(kù)間的編程接口谈喳,也是封裝重復(fù)性工作的一種有效方法,它支持用戶變量戈泼、條件執(zhí)行及其它的編程功能婿禽。

(2)存儲(chǔ)過(guò)程的語(yǔ)法

CREATE PROCEDURE procedure_name([paramters[,...]])[attributes]
BEGIN
    body_statement
END;

注:
procedure_name:存儲(chǔ)過(guò)程的名字
paramters:存儲(chǔ)過(guò)程的過(guò)程參數(shù),包含:IN大猛、OUT及INOUT扭倾。IN代表輸入或傳入值,在存儲(chǔ)過(guò)程中被修改挽绩,但不返回膛壹;OUT代表輸出或傳出值,在存儲(chǔ)過(guò)程中被修改唉堪,并返回模聋;INOUT代表輸入輸出,在存儲(chǔ)過(guò)程中被修改唠亚,并返回链方;body_statement:存儲(chǔ)過(guò)程體,這里可以放入sql集灶搜,也可以內(nèi)嵌存儲(chǔ)過(guò)程祟蚀。

好處:
相對(duì)于直接使用sql語(yǔ)句,在應(yīng)用程序中直接調(diào)用存儲(chǔ)過(guò)程有以下好處:
(1)減少網(wǎng)絡(luò)通信量割卖。調(diào)用一個(gè)行數(shù)不多的存儲(chǔ)過(guò)程與直接調(diào)用sql語(yǔ)句的網(wǎng)絡(luò)通信量可能不會(huì)有很大的差別前酿,可是如果存儲(chǔ)過(guò)程包含上百行sql語(yǔ)句,那么其性能絕對(duì)比一條一條的調(diào)用sql語(yǔ)句要高的多鹏溯。
(2)執(zhí)行速度更快罢维。有兩個(gè)原因:首先,在存儲(chǔ)過(guò)程創(chuàng)建的時(shí)候剿涮,數(shù)據(jù)庫(kù)已經(jīng)對(duì)其進(jìn)行了一次解析和優(yōu)化言津。其次,存儲(chǔ)過(guò)程一旦執(zhí)行取试,在內(nèi)存中就會(huì)保留一份這個(gè)存儲(chǔ)過(guò)程悬槽,這樣下次再執(zhí)行同樣的存儲(chǔ)過(guò)程時(shí),可以從內(nèi)存中直接調(diào)用瞬浓。
(3)更強(qiáng)的適應(yīng)性:由于存儲(chǔ)過(guò)程對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)時(shí)通過(guò)存儲(chǔ)過(guò)程來(lái)進(jìn)行的初婆,因此數(shù)據(jù)庫(kù)開(kāi)發(fā)人員可以在不改動(dòng)存儲(chǔ)過(guò)程接口的情況下對(duì)數(shù)據(jù)庫(kù)進(jìn)行任何改動(dòng),而這些改動(dòng)不會(huì)對(duì)應(yīng)用程序造成影響。
(4)布式工作:應(yīng)用程序和數(shù)據(jù)庫(kù)的編碼工作可以分別獨(dú)立進(jìn)行磅叛,而不會(huì)相互壓制屑咳。

七、 樂(lè)觀鎖和悲觀鎖是什么弊琴?

樂(lè)觀鎖和悲觀鎖是兩種并發(fā)控制機(jī)制兆龙。
首先了解一下為什么需要鎖(并發(fā)控制)?
在多用戶環(huán)境中敲董,在同一時(shí)間可能會(huì)有多個(gè)用戶更新相同的記錄紫皇,這會(huì)產(chǎn)生沖突。這就是著名的并發(fā)性問(wèn)題腋寨。

典型的沖突有
(1)丟失更新:一個(gè)事務(wù)的更新覆蓋了其他事務(wù)的更新結(jié)果聪铺,這就是所謂的更新丟失。例如:用戶A把值從6改為2萄窜,用戶B把值從2改為6铃剔,則用戶A丟失了他的更新。
(2)臟讀:當(dāng)一個(gè)事務(wù)讀取其它完成一半事務(wù)的記錄時(shí)查刻,就會(huì)發(fā)生臟讀取键兜。例如:用戶A,B看到的值都是6穗泵,用戶B把值改為2蝶押,用戶A讀到的值仍為6.
為了解決這些并發(fā)帶來(lái)的問(wèn)題,我們需要引入并發(fā)控制機(jī)制火欧。

并發(fā)控制機(jī)制
最常用的處理多用戶并發(fā)訪問(wèn)的方法是加鎖。當(dāng)一個(gè)用戶鎖住數(shù)據(jù)庫(kù)中的某個(gè)對(duì)象時(shí)茎截,其他用戶就不能再訪問(wèn)該對(duì)象苇侵。加鎖對(duì)并發(fā)訪問(wèn)的影響體現(xiàn)在鎖的粒度上。比如企锌,放在一個(gè)表上的鎖限制對(duì)整個(gè)表的并發(fā)訪問(wèn)榆浓;放在數(shù)據(jù)頁(yè)上的鎖限制了對(duì)整個(gè)數(shù)據(jù)頁(yè)的訪問(wèn);放在行上的鎖只限制對(duì)該行的并發(fā)訪問(wèn)撕攒《妇椋可見(jiàn)行鎖粒度最小,并發(fā)訪問(wèn)最好抖坪,頁(yè)鎖粒度最大萍鲸,表鎖介于兩者之間。

悲觀鎖:假定會(huì)發(fā)生并發(fā)沖突擦俐,屏蔽一切可能違反數(shù)據(jù)完整性的操作脊阴。
悲觀鎖假定其他用戶企圖訪問(wèn)或者改變你正在訪問(wèn)、更改的對(duì)象的概率是很高的,因此在悲觀鎖的環(huán)境中嘿期,在你開(kāi)始改變此對(duì)象之前就將該對(duì)象鎖住品擎,并且直到你提交了所作的更改之后才釋放鎖。悲觀的缺陷是不論是頁(yè)鎖還是行鎖备徐,加鎖的時(shí)間可能會(huì)很長(zhǎng)萄传,這樣可能會(huì)長(zhǎng)時(shí)間的限制其他用戶的訪問(wèn),也就是說(shuō)悲觀鎖的并發(fā)訪問(wèn)性不好蜜猾。

樂(lè)觀鎖:假設(shè)不會(huì)發(fā)生并發(fā)沖突秀菱,只在提交操作時(shí)檢查是否違反數(shù)據(jù)完整性
樂(lè)觀鎖不能解決臟讀的問(wèn)題瓣铣。樂(lè)觀鎖則認(rèn)為其他用戶企圖改變你正在更改的對(duì)象的概率是很小的答朋,因此樂(lè)觀鎖直到你準(zhǔn)備提交所作的更改時(shí)才將對(duì)象鎖住,當(dāng)你讀取以及改變?cè)搶?duì)象時(shí)并不加鎖棠笑∶瓮耄可見(jiàn)樂(lè)觀鎖加鎖的時(shí)間要比悲觀鎖短,樂(lè)觀鎖可以用較大的鎖粒度獲得較好的并發(fā)訪問(wèn)性能蓖救。但是如果第二個(gè)用戶恰好在第一個(gè)用戶提交更改之前讀取了該對(duì)象洪规,那么當(dāng)他完成了自己的更改進(jìn)行提交時(shí),數(shù)據(jù)庫(kù)就會(huì)發(fā)現(xiàn)該對(duì)象已經(jīng)變化了循捺,這樣斩例,第二個(gè)用戶不得不重新讀取該對(duì)象并作出更改。這說(shuō)明在樂(lè)觀鎖環(huán)境中从橘,會(huì)增加并發(fā)用戶讀取對(duì)象的次數(shù)念赶。

樂(lè)觀鎖的應(yīng)用
(1)使用自增長(zhǎng)的整數(shù)表示數(shù)據(jù)版本號(hào)。更新時(shí)檢查版本號(hào)是否一致恰力,比如數(shù)據(jù)庫(kù)中數(shù)據(jù)版本為6叉谜,更新提交時(shí)version=6+1,使用該version值(=7)與數(shù)據(jù)庫(kù)version+1(=7)作比較踩萎,如果相等停局,則可以更新,如果不等則有可能其他程序已更新該記錄香府,所以返回錯(cuò)誤董栽。
(2)使用時(shí)間戳來(lái)實(shí)現(xiàn)。

悲觀鎖應(yīng)用
需要使用數(shù)據(jù)庫(kù)的鎖機(jī)制企孩,比如SQL server的TABLOCKX(排它表鎖)此選項(xiàng)被選中時(shí)锭碳,SQL server將在整個(gè)表上置排它鎖直至該命令或事務(wù)結(jié)束。這將防止其他進(jìn)程讀取或修改表中的數(shù)據(jù)柠硕。

總結(jié)
在實(shí)際生產(chǎn)環(huán)境里邊工禾,如果并發(fā)量不大且不允許臟讀运提,可以使用悲觀鎖解決并發(fā)問(wèn)題;但如果系統(tǒng)的并發(fā)非常大的話闻葵,悲觀鎖定會(huì)帶來(lái)非常大的性能問(wèn)題民泵,所以我們就要選擇樂(lè)觀鎖定的方法。

八槽畔、 表鎖栈妆、頁(yè)鎖、行鎖的區(qū)別厢钧?

行級(jí)鎖是mysql中鎖定粒度最細(xì)的一種鎖鳞尔,表示只針對(duì)當(dāng)前操作的行進(jìn)行加鎖。行級(jí)鎖能大大減少數(shù)據(jù)庫(kù)操作的沖突早直。其加鎖粒度最小寥假,但加鎖的開(kāi)銷(xiāo)也最大。行級(jí)鎖分為共享鎖和排他鎖霞扬。
特點(diǎn):開(kāi)銷(xiāo)大糕韧,加鎖慢;會(huì)出現(xiàn)死鎖喻圃;鎖定粒度最小萤彩,發(fā)生鎖沖突的概率最低,并發(fā)度也最高斧拍。

表級(jí)鎖是mysql中鎖定粒度最大的一種鎖雀扶,表示對(duì)當(dāng)前操作的整張表加鎖,它實(shí)現(xiàn)簡(jiǎn)單肆汹,資源消耗較少愚墓,被大部分Mysql引擎支持。最常使用的myisam和innodb都支持表級(jí)鎖定昂勉。表級(jí)鎖定分為表共享讀鎖(共享鎖)和表獨(dú)占寫(xiě)鎖(排他鎖)转绷。
特點(diǎn):開(kāi)銷(xiāo)小,加鎖快硼啤;不會(huì)出現(xiàn)死鎖;鎖定粒度大斧账,發(fā)出鎖沖突的概率最高谴返,并發(fā)度最低。

頁(yè)級(jí)鎖是mysql鐘鎖定粒度介于行級(jí)鎖和表級(jí)鎖中間的一種鎖咧织。表級(jí)鎖速度快嗓袱,但沖突多,行級(jí)沖突少习绢,但速度慢渠抹。所以取了折中的頁(yè)級(jí)蝙昙,一次鎖定相鄰的一組記錄。BDB支持頁(yè)級(jí)表梧却。
特點(diǎn):開(kāi)銷(xiāo)和加鎖時(shí)間介于表鎖和行鎖之間奇颠;會(huì)出現(xiàn)死鎖;鎖定粒度介于表鎖和行鎖之間放航,并發(fā)度一般烈拒。

上述三種鎖的特性可大致歸納如下:
1) 表級(jí)鎖:開(kāi)銷(xiāo)小,加鎖快广鳍;不會(huì)出現(xiàn)死鎖荆几;鎖定粒度大,發(fā)生鎖沖突的概率最高赊时,并發(fā)度最低吨铸。
2) 行級(jí)鎖:開(kāi)銷(xiāo)大,加鎖慢祖秒;會(huì)出現(xiàn)死鎖诞吱;鎖定粒度最小,發(fā)生鎖沖突的概率最低狈涮,并發(fā)度也最高狐胎。
3) 頁(yè)面鎖:開(kāi)銷(xiāo)和加鎖時(shí)間界于表鎖和行鎖之間;會(huì)出現(xiàn)死鎖歌馍;鎖定粒度界于表鎖和行鎖之間握巢,并發(fā)度一般。

九松却、 having和where的區(qū)別暴浦?

where語(yǔ)句在group by語(yǔ)句之前,sql會(huì)在分組之前計(jì)算where語(yǔ)句晓锻。
having語(yǔ)句在group by語(yǔ)句之后歌焦,sql會(huì)在分組之后計(jì)算having語(yǔ)句。

where是一個(gè)約束聲明砚哆,使用where約束來(lái)自數(shù)據(jù)庫(kù)的數(shù)據(jù)独撇,where是在結(jié)果返回之前起作用的,where中不能使用聚合函數(shù)躁锁。having是一個(gè)過(guò)濾聲明纷铣,是在查詢返回結(jié)果集以后對(duì)查詢結(jié)果進(jìn)行的過(guò)濾操作,在having中可以使用聚合函數(shù)战转。
在查詢過(guò)程中聚合語(yǔ)句(sum,min,max,avg,count)要比having子句優(yōu)先執(zhí)行搜立。而where子句在查詢過(guò)程中執(zhí)行優(yōu)先級(jí)高于聚合語(yǔ)句。

例一:要查找平均工資大于3000的部門(mén)槐秧,則sql語(yǔ)句應(yīng)為:

select department, avg(salary) as average from salary_info
group by department having average>3000

此時(shí)只能使用having啄踊,而不能使用where忧设。一來(lái),我們要使用聚合語(yǔ)句avg颠通;二來(lái)址晕,我們要對(duì)聚合后的結(jié)果進(jìn)行篩選(average>3000),因此使用where會(huì)被告知sql有誤蒜哀。

例二:要查詢每個(gè)部門(mén)工資大于3000的員工個(gè)數(shù)

select department, count(*) as c from salary_info
where salary>3000 group by department.

此處的where不可用having進(jìn)行替換斩箫,因?yàn)槭侵苯訉?duì)庫(kù)中的數(shù)據(jù)進(jìn)行篩選,而非對(duì)結(jié)果集進(jìn)行篩選撵儿。

where和having的執(zhí)行級(jí)別不同
在查詢過(guò)程中聚合語(yǔ)句(sum,min,max,avg,count)要比having子句優(yōu)先執(zhí)行.而where子句在查詢過(guò)程中執(zhí)行優(yōu)先級(jí)別優(yōu)先于聚合語(yǔ)句(sum,min,max,avg,count)乘客。
having就是來(lái)彌補(bǔ)where在分組數(shù)據(jù)判斷時(shí)的不足。因?yàn)閣here執(zhí)行優(yōu)先級(jí)別要快于聚合語(yǔ)句淀歇。

十易核、 事務(wù)的隔離級(jí)別?

隔離級(jí)別 臟讀 不可重復(fù)讀 幻讀
未提交讀 可能 可能 可能
已提交讀 不可能 可能 可能
可重復(fù)讀 不可能 不可能 可能
可串行化 不可能 不可能 不可能



未提交讀:允許臟讀浪默,也就是可能讀取到其他會(huì)話中未提交事務(wù)修改的數(shù)據(jù)牡直。
已提交讀:只能讀取到已經(jīng)提交的數(shù)據(jù)。Oracle等多數(shù)數(shù)據(jù)庫(kù)默認(rèn)是該級(jí)別(不重復(fù)讀)纳决。
可重復(fù)讀:在同一個(gè)事務(wù)內(nèi)的查詢都是事務(wù)開(kāi)始時(shí)刻一致的碰逸,innodb默認(rèn)級(jí)別。在sql標(biāo)準(zhǔn)中阔加,該隔離級(jí)別消除了不可重復(fù)讀饵史,但是還存在幻象讀。
串行讀:完全串行化的讀胜榔,每次讀都需要獲得表級(jí)共享鎖胳喷,讀寫(xiě)相互都會(huì)阻塞。

四個(gè)級(jí)別逐漸增強(qiáng)夭织,每個(gè)級(jí)別解決一個(gè)問(wèn)題吭露。事務(wù)級(jí)別越高,性能越差

臟讀:是指當(dāng)一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改尊惰,而這種修改還沒(méi)有提交到數(shù)據(jù)庫(kù)中讲竿,這時(shí),另外一個(gè)事務(wù)也訪問(wèn)這個(gè)數(shù)據(jù)弄屡,然后使用了這個(gè)數(shù)據(jù)戴卜。

不可重復(fù)讀:是指在一個(gè)事務(wù)中,多次讀同一數(shù)據(jù)琢岩。在這個(gè)事務(wù)還沒(méi)有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問(wèn)該同一數(shù)據(jù)师脂。那么担孔,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間江锨,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的數(shù)據(jù)可能是不一樣的糕篇。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的啄育,因此稱為是不可重復(fù)讀。

可重復(fù)讀:第一個(gè)事務(wù)兩次讀到的數(shù)據(jù)是一樣的拌消。

幻讀:第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改挑豌,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí)墩崩,第二個(gè)事務(wù)也修改了這個(gè)表中的數(shù)據(jù)氓英,這種修改是向表中插入一行新數(shù)據(jù)。那么鹦筹,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒(méi)有修改的數(shù)據(jù)行铝阐,就好像發(fā)生了幻覺(jué)一樣。
本事務(wù)中第一次讀取出一行铐拐,做了一次更新后徘键,另一個(gè)事務(wù)里提交的數(shù)據(jù)就出現(xiàn)了。也可以看做是一種幻讀遍蟋。

一道筆試題:
小桔A在事務(wù)1中第一次讀取年齡20歲的員工總數(shù)為1000人吹害,之后小桔B在事務(wù)2中增加了100名年齡20歲的新員工,之后小桔A在事務(wù)1中再次讀取年齡20歲的員工數(shù)發(fā)現(xiàn)總數(shù)變?yōu)?100人虚青,屬于()它呀?
A、臟讀
B挟憔、不可重復(fù)讀
C钟些、幻讀
選C
幻讀的重點(diǎn)在于新增或者刪除
同樣的條件,第一次和第二次讀出來(lái)的記錄數(shù)不一樣
例子:
目前工資為1000的員工有10人
事務(wù)1绊谭,讀取所有工資為1000的員工政恍,共讀取10條記錄。
這時(shí)另一個(gè)事務(wù)向employee表插入了一條員工記錄达传。
事務(wù)1再次讀取所有工資為1000的員工共讀取到了11條記錄篙耗,這就產(chǎn)生了幻像讀

不可重復(fù)讀的重點(diǎn)是修改
同樣的條件,你讀取過(guò)的數(shù)據(jù)宪赶,再次讀取出來(lái)發(fā)現(xiàn)值不一樣了
例如:
在事務(wù)1中宗弯,Mary讀取了自己的工資為1000,操作并沒(méi)有完成搂妻。
在事務(wù)2中蒙保,這時(shí)財(cái)務(wù)人員修改了Mary的工資為2000,并提交了事務(wù)欲主。
在事務(wù)1中邓厕,Mary再次讀取自己的工資時(shí)逝嚎,工資變味了2000。

臟讀:
臟讀就是指當(dāng)一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù)详恼,并且對(duì)數(shù)據(jù)進(jìn)行了修改补君,而這種修改還沒(méi)有提交到數(shù)據(jù)庫(kù)中,這時(shí)昧互,另外一個(gè)事務(wù)也訪問(wèn)這個(gè)數(shù)據(jù)挽铁,然后使用了這個(gè)數(shù)據(jù)。

十一敞掘、 事務(wù)的特點(diǎn)有哪些叽掘?

ACID含義:
原子性(Atomicity):一個(gè)事務(wù)要么發(fā)生,要么不發(fā)生渐逃。
例如故障發(fā)生在write(A)和read(B)之間够掠,則將有可能造成賬戶A的余額已經(jīng)減少50元錢(qián),而賬戶B的余額卻沒(méi)有改變茄菊,憑空就少了50元錢(qián)疯潭。
一致性(Consistency):數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整性,保證他們的正確性面殖。
隔離性(Isolation):多個(gè)事務(wù)并發(fā)(同時(shí))執(zhí)行竖哩,互相不影響
持久性(Durability):每個(gè)事務(wù)成功執(zhí)行后對(duì)數(shù)據(jù)庫(kù)的修改是永久的。即使系統(tǒng)出現(xiàn)故障也不受影響脊僚。

十二相叁、 觸發(fā)器是什么?

觸發(fā)器是SQL server提供給程序員和數(shù)據(jù)分析員來(lái)保證數(shù)據(jù)完整性的一種方法辽幌,它是與表事件相關(guān)的特殊存儲(chǔ)過(guò)程增淹,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng)乌企,而是由事件觸發(fā)虑润。比如當(dāng)對(duì)一個(gè)表進(jìn)行操作(insert,delete加酵,update)時(shí)就會(huì)激活它執(zhí)行拳喻。觸發(fā)器經(jīng)常用于加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等。

在mysql中猪腕,創(chuàng)建觸發(fā)器語(yǔ)法如下:

Create trigger trigger_name trigger_time trigger_event on tbl_name for each row trigger_stmt

其中:
Trigger_name:標(biāo)識(shí)觸發(fā)器名稱冗澈,用戶自行指定
trigger_time:標(biāo)識(shí)觸發(fā)時(shí)機(jī),取值為before或after
Trigger_event:標(biāo)識(shí)觸發(fā)事件陋葡,取值為insert,update或delete
Tbl_name:標(biāo)識(shí)建立觸發(fā)器的表名亚亲,即在哪張表上建立觸發(fā)器
Trigger_stmt:觸發(fā)器程序體,可以是一句sql語(yǔ)句,或者用begin和end包含的多條語(yǔ)句捌归。

由此可見(jiàn)颊亮,可以建立6種觸發(fā)器,即:before insert陨溅、before update、before delete绍在、after insert门扇、after update、after delete偿渡。
注意:不能同時(shí)在一個(gè)表上建立2個(gè)相同類型的觸發(fā)器臼寄,因此在一個(gè)表上最多建立6個(gè)觸發(fā)器。

SQL Server包括三種常規(guī)類型的觸發(fā)器:DML觸發(fā)器溜宽、DDL觸發(fā)器和登錄觸發(fā)器

DML觸發(fā)器
當(dāng)數(shù)據(jù)庫(kù)中表中的數(shù)據(jù)發(fā)生變化時(shí)吉拳,包括insert,update适揉,delete任意操作留攒,如果我們對(duì)該表寫(xiě)了對(duì)應(yīng)的DML觸發(fā)器,那么該觸發(fā)器自動(dòng)執(zhí)行嫉嘀。DML觸發(fā)器的主要作用在于強(qiáng)制執(zhí)行業(yè)務(wù)規(guī)則炼邀,以及擴(kuò)展sql server約束,默認(rèn)值等剪侮。因?yàn)槲覀冎兰s束只能約束同一個(gè)表中的數(shù)據(jù)拭宁,而觸發(fā)器中則可以執(zhí)行任意sql命令。

DDL觸發(fā)器
主要用于審核與規(guī)范對(duì)數(shù)據(jù)庫(kù)中表瓣俯,觸發(fā)器杰标,視圖等結(jié)構(gòu)上的操作。比如在修改表彩匕,修改列腔剂,新增表,新增列等推掸。它在數(shù)據(jù)庫(kù)結(jié)構(gòu)發(fā)生變化時(shí)執(zhí)行桶蝎,我們主要用它來(lái)記錄數(shù)據(jù)庫(kù)的修改過(guò)程,以及限制程序員對(duì)數(shù)據(jù)庫(kù)的修改谅畅,比如不允許刪除某些指定表等登渣。

登錄觸發(fā)器
登錄觸發(fā)器將為響應(yīng)LOGIN事件而激發(fā)存儲(chǔ)過(guò)程。與SQL server實(shí)例建立用戶會(huì)話時(shí)將引發(fā)此事件毡泻。登陸觸發(fā)器將在登錄的身份驗(yàn)證階段完成之后且用戶會(huì)話實(shí)際建立之前激發(fā)胜茧。因此,來(lái)自觸發(fā)器內(nèi)部且通常將到達(dá)用戶的所有消息會(huì)傳送到SQL Server錯(cuò)誤日志。如果身份驗(yàn)證失敗呻顽,將不激發(fā)登錄觸發(fā)器雹顺。

觸發(fā)器的作用:
1、可在寫(xiě)入數(shù)據(jù)表前廊遍,強(qiáng)制檢驗(yàn)或轉(zhuǎn)換數(shù)據(jù)
2嬉愧、觸發(fā)器發(fā)生錯(cuò)誤時(shí),異動(dòng)的結(jié)果會(huì)被撤銷(xiāo)
3喉前、部分?jǐn)?shù)據(jù)庫(kù)管理系統(tǒng)可以針對(duì)數(shù)據(jù)定義語(yǔ)言(DDL)使用觸發(fā)器没酣,稱為DDL觸發(fā)器
4、可依照特定的情況卵迂,替換異動(dòng)的指令(INSTEAD OF)

DML觸發(fā)器又可分為After觸發(fā)器和Instead Of觸發(fā)器
(1)After觸發(fā)器:這類觸發(fā)器是在記錄已經(jīng)改變完之后(after)裕便,才會(huì)被激活執(zhí)行,它主要是用于記錄變更后的處理或檢查见咒,一旦發(fā)現(xiàn)錯(cuò)誤偿衰,也可以用Rollback Transaction語(yǔ)句來(lái)回滾本次的操作。
(2)Instead of觸發(fā)器:這類觸發(fā)器一般是用來(lái)取代原本的操作改览,在記錄變更之前發(fā)生的下翎,它并不去執(zhí)行原來(lái)SQL語(yǔ)句里的操作(insert、update恃疯、delete)漏设,而去執(zhí)行觸發(fā)器本身所定義的操作。
在SQL Server里今妄,每個(gè)DML觸發(fā)器都分配有兩個(gè)特殊的表郑口,一個(gè)是Inserted表,一個(gè)是Deleted表盾鳞。它們兩個(gè)存在于數(shù)據(jù)庫(kù)服務(wù)器的內(nèi)存中犬性,是由系統(tǒng)管理的邏輯表,是兩個(gè)臨時(shí)表腾仅,而不是真正存儲(chǔ)在數(shù)據(jù)庫(kù)中的物理表乒裆。用戶對(duì)這兩個(gè)表只有讀取的權(quán)限,沒(méi)有修改的權(quán)限推励。
這兩個(gè)表的結(jié)構(gòu)(主外鍵联予、字段昙楚、數(shù)據(jù)類型等)與觸發(fā)器所在數(shù)據(jù)表的結(jié)構(gòu)是完全一致的,當(dāng)觸發(fā)器的工作完成之后,這兩個(gè)表也將會(huì)從內(nèi)存中刪除挺峡。

Inserted和Deleted兩個(gè)表的作用:
Inserted:對(duì)于插入記錄操作來(lái)說(shuō)扫皱,插入表里存放的是要插入的數(shù)據(jù)埠胖;對(duì)于更新記錄操作來(lái)說(shuō)间聊,插入表里存放的是要更新的記錄族购。
Deleted:對(duì)于更新記錄操作來(lái)說(shuō),刪除表里存放的是被更新記錄陵珍;對(duì)于刪除記錄操作來(lái)說(shuō)寝杖,刪除表里存入的是被刪除的舊記錄。

激活觸發(fā)器的操作 Inserted表 Deleted表
Insert 存放要插入到表中的數(shù)據(jù) 無(wú)
Update 存放要更新到表中的數(shù)據(jù) 存放被更新的記錄
Delete 無(wú) 存放要?jiǎng)h除的記錄



網(wǎng)上找的一張圖互纯,可以幫助理解一下過(guò)程瑟幕。

注意事項(xiàng):
(1)只有表才可以支持觸發(fā)器,視圖和臨時(shí)表都不支持觸發(fā)器
(2)每個(gè)表的每個(gè)事件只支持一個(gè)觸發(fā)器留潦,因此每個(gè)表最多支持6個(gè)觸發(fā)器(觸發(fā)器應(yīng)該相應(yīng)的行動(dòng)insert,delete,update收苏,觸發(fā)器何時(shí)執(zhí)行before,after,2*3=6種)
(3)單一觸發(fā)器不能與多個(gè)操作相關(guān)
(4)觸發(fā)器不能更新和覆蓋愤兵,如果想更新一個(gè)觸發(fā)器必須先刪除,再創(chuàng)建排吴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秆乳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钻哩,更是在濱河造成了極大的恐慌屹堰,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件街氢,死亡現(xiàn)場(chǎng)離奇詭異扯键,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)珊肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)荣刑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人伦乔,你說(shuō)我怎么就攤上這事厉亏。” “怎么了烈和?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵爱只,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我招刹,道長(zhǎng)恬试,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任疯暑,我火速辦了婚禮训柴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缰儿。我一直安慰自己畦粮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著宣赔,像睡著了一般预麸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儒将,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天吏祸,我揣著相機(jī)與錄音,去河邊找鬼钩蚊。 笑死贡翘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砰逻。 我是一名探鬼主播鸣驱,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝠咆!你這毒婦竟也來(lái)了踊东?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刚操,失蹤者是張志新(化名)和其女友劉穎闸翅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菊霜,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坚冀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鉴逞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片记某。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖构捡,靈堂內(nèi)的尸體忽然破棺而出辙纬,到底是詐尸還是另有隱情,我是刑警寧澤叭喜,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布贺拣,位于F島的核電站,受9級(jí)特大地震影響捂蕴,放射性物質(zhì)發(fā)生泄漏譬涡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一啥辨、第九天 我趴在偏房一處隱蔽的房頂上張望涡匀。 院中可真熱鬧,春花似錦溉知、人聲如沸陨瘩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舌劳。三九已至帚湘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甚淡,已是汗流浹背大诸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贯卦,地道東北人资柔。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撵割,于是被迫代替她去往敵國(guó)和親贿堰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容