Mysql燕十八學(xué)習(xí)筆記_第1頁(yè)
Mysql燕十八學(xué)習(xí)筆記_第2頁(yè)
Mysql燕十八學(xué)習(xí)筆記_第3頁(yè)
Mysql燕十八學(xué)習(xí)筆記_第4頁(yè)
Mysql燕十八學(xué)習(xí)筆記_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Mysql三大列類(lèi)型

1.數(shù)值型

整型

Tinyint>Smallint^Mediumint>Int>Bigint

小數(shù)型

Float(D,M),Decimal(D,M)

2.字符串型

Char(M)

Varchar(M)

Text文本類(lèi)型

3.日期時(shí)間類(lèi)型

Date日期

Time時(shí)間

Datetime時(shí)間類(lèi)型

Year年類(lèi)型

一.整型列的字節(jié)及存儲(chǔ)范圍

從數(shù)學(xué)上討論tinyint,建表時(shí)既能足夠存放,又不

浪費(fèi)空間。

即:

(1).占據(jù)空間

(2).存儲(chǔ)范圍

Tinyint微小的列類(lèi)型,1字節(jié)。

類(lèi)型字節(jié)最小值最大值

(帶符號(hào)/無(wú)符號(hào))(帶符號(hào)/無(wú)符號(hào))

Tinyint1-128127

0255

Smallint2-3276832767

065535

Mediumint3-2-232123T

02124T

Int4-2^312131T

02132T

Bigint8-2飛32163T

02"64-1

通過(guò)占用字節(jié)和所存范圍分關(guān)系合理的選擇類(lèi)型。

例:Tinyint

經(jīng)測(cè)試,Tinyint的默認(rèn)為有符號(hào)-128?127之間,當(dāng)越界時(shí)自動(dòng)

取相應(yīng)的邊界值。若要存0~255無(wú)符號(hào)時(shí):

列的可選屬性:

Tinyint(M)unsignedzerofill.

M:寬度(在。填充的時(shí)候才有意義)

Unsigned:無(wú)符號(hào)類(lèi)型(非負(fù)),影響存儲(chǔ)范圍

Zerofill:0填充(默認(rèn)無(wú)符號(hào))

列可以聲明默認(rèn)值,而且推薦聲明默認(rèn)值notnulldefault0;

二.小數(shù)型/浮點(diǎn)型、定點(diǎn)型

Float(M,D):M代表總位數(shù),D代表小數(shù)位

(6,2)為例:-9999.99->9999.99

Decimal(D,M):

三.字符型列

Char:定長(zhǎng),char(M),M代表寬度,即:可容納的字符數(shù)(K=M<=255

Varchar:變長(zhǎng),0<=M<=65535(約2W—6W個(gè)字符受字符集影響)

Text文本串,(約2W—6W個(gè)字符受字符集影響)

區(qū)別在哪呢?

char定長(zhǎng):M個(gè)字符,如果存的小于M個(gè)字符,實(shí)占M個(gè)字符

varchar:M個(gè)字符,存的小于M個(gè)字符,設(shè)為N,N<M,實(shí)占N

個(gè)字符

因此,char定長(zhǎng)若存空格,讀取時(shí)會(huì)丟失。而變長(zhǎng)不會(huì)。

Char利用率小于等于100%,而varchar永遠(yuǎn)小于100%,1-2個(gè)

字節(jié)用于標(biāo)志實(shí)存字符長(zhǎng)度。

Char(M)如何占據(jù)M個(gè)字符寬度?

答:如果實(shí)際存儲(chǔ)內(nèi)容不足M個(gè),則后面加空格補(bǔ)齊,取出來(lái)的

時(shí)候再把后面的空格去掉,(所以如果內(nèi)容后面有空格,將會(huì)被

清除)

選擇原則:

1.空間利用效率(M固定選Char)

2.速度

速度上:定長(zhǎng)速度快些,

四.日期時(shí)間列類(lèi)型

Date日期

Time時(shí)間

Datatime時(shí)間類(lèi)型

Year年類(lèi)型

1.Year類(lèi)型:1個(gè)字節(jié)表示1901-2155年【0000年

表示錯(cuò)誤時(shí)】

如果輸入兩位,“00—69”表示2000—2069,

如果輸入兩位“70—99”表示1970—1999

如果記得麻煩,輸入四位就行了、

2.Date類(lèi)型:典型格式,1992-08T2

'1000-01-01''9999-12-3T

3.Time類(lèi)型,典型格式hh:mm:ss

'-838:59:59''+838:59:59'

4.Datetime典型格式:'1989-05-0612:23:34'

41000-01-0100:00:00,(9999-12-3123:59:59'

注意:

在開(kāi)發(fā)中很少使用日期時(shí)間類(lèi)型來(lái)表示一個(gè)需要精確到秒的

歹U,原因:雖然日期時(shí)間類(lèi)型能夠精確到秒,而且方便查看。

但是計(jì)算不便。用時(shí)間戳來(lái)表示。

時(shí)間戳:1970-01-0100:00:00到當(dāng)前的秒數(shù)

面試1:

當(dāng)表示性別時(shí),可用1或。表示男女,如,

可能會(huì)問(wèn)到為什么不用enum枚舉,原因:enum不符合關(guān)系型數(shù)

據(jù)庫(kù)設(shè)計(jì)理念,而且字節(jié)上不比tinyint少。

實(shí)例:

增刪改查之案例過(guò)程分析

用戶(hù)注冊(cè)表單收集,提交數(shù)據(jù),注冊(cè)頁(yè)面收集到表單的數(shù)據(jù)后,

形成insert語(yǔ)句,user表插入該條數(shù)據(jù),用戶(hù)注冊(cè)完成

前臺(tái)用戶(hù)中心,用戶(hù)新昵稱(chēng),根據(jù)新昵稱(chēng)和用戶(hù)id,形成update

語(yǔ)句,完成昵稱(chēng)修改

管理后臺(tái)點(diǎn)擊會(huì)員列表,此時(shí),網(wǎng)頁(yè)形成select語(yǔ)句,查詢(xún)出

所有會(huì)員的數(shù)據(jù),完成會(huì)員的查看

管理員后臺(tái)選中某用戶(hù)并且刪除,捕捉此用戶(hù)的id,根據(jù)用戶(hù)

id形成相應(yīng)的delete語(yǔ)句

執(zhí)行delete語(yǔ)句,完成用戶(hù)的刪除。

階段總結(jié)(-)

列類(lèi)型的概念

數(shù)值型

整型tinyintsmallintmediumintintbigint

整型的unsigned代表無(wú)符號(hào),zerofill代表0填充,

M代表寬度(在0填充)

浮點(diǎn)型/定點(diǎn)型float(M,D)unsignedM精度,即總位

數(shù),D代表小數(shù)位decimal比f(wàn)loat更精確。

字符型

Char(M)定長(zhǎng),可存儲(chǔ)的字符數(shù),M<=255

Varchar(M),變長(zhǎng),可存儲(chǔ)的字節(jié)數(shù),M<=65535

Char及varchar的不同點(diǎn)

Char(M),實(shí)占M個(gè)字符,不夠M個(gè)右側(cè)補(bǔ)空格,取出時(shí),在去除

右側(cè)空格,導(dǎo)致右側(cè)真有空格時(shí)會(huì)丟失。

Varchar(M),有卜2個(gè)字節(jié)來(lái)標(biāo)記真實(shí)的長(zhǎng)度,

日期時(shí)間型

Year1901-2155,如果輸2位,'00-69'之間+2000「70-99'

之間+1900

DateYYYY-MM-DD,范圍在1000-01-019999-12-31

TimeHH:ii:ss,范圍在-838:59:59838:59:59

DatetimeYY-MM-DDHH:ii:ss1000-01-01

00:00:009999-12-3123:59:59

開(kāi)發(fā)中的一個(gè)問(wèn)題一精確到秒的時(shí)間表示方式,不是用

datetime,而是用int來(lái)表示時(shí)間戳

用時(shí)間戳方便計(jì)算,而且方便格式化成不同的顯示樣式。

建表語(yǔ)句

Createtable表明(

列名稱(chēng),列類(lèi)型[列屬性][默認(rèn)值],

)engine引擎名charset字符集

增:insert

答:往哪張表增,增那幾列,各為什么值?

Insertinto表名

(列1,列2,..列N)

Values

(值1,值2..值N)

**如果不聲明插入的列,則默認(rèn)插入所有列。

改:update

答:修改哪張表,修改那幾列,修改成什么值?在哪幾行

上生效?

Update表名

Set

列1=值1,

列2=值2,

歹UN=值N

Where表達(dá)式;

刪:delete

刪除哪張表的數(shù)據(jù),刪除哪些行?

Deletefrom表名

Where表達(dá)式

查:select*from表名

查詢(xún)的五種語(yǔ)句:where,group,having,orderby,limit

一.Where條件查詢(xún)

比較運(yùn)算符

1.In〈值1,值2,值3…..值N〉,等于1N任意一個(gè)。

例:selectgoods_idfromgoodswherecat_idin(4,5);

2.Between值1and值2,表示在值1和值2之間

例:selectgoods_idfromgoodswherecatidbetween

1and5;

邏輯運(yùn)算符

1.Not邏輯非

例:selectgood_idfromgoodswherecat_idnot

in(4,5);

2.Or邏輯或

3.And邏輯及

模糊查詢(xún):

案例:想查找‘諾基亞'開(kāi)頭的所有商品

Like像,%通配任意字符_單個(gè)字符

Selectgoods_idfromgoodswheregoods_namelike'諾基

亞%';

Selectgoodsidfromgoodswheregoods_namelike'諾基

亞_';

二.Group分組查詢(xún)

Groupby

作用:把行按字段分組

語(yǔ)法:groupbycoll,col2…colN

運(yùn)用場(chǎng)合:常見(jiàn)于統(tǒng)計(jì)場(chǎng)合,如按欄目計(jì)算帖子數(shù),統(tǒng)計(jì)

每個(gè)人的平均成績(jī)等。

Group及統(tǒng)計(jì)函數(shù)

Max:求最大,

min:求最小,

sum:求總和,

avg:求平均,

count:求總行數(shù)

練習(xí):

三.Having

*******例題:

只用一個(gè)select,不用子查詢(xún)和左連接。

四.Orderby

Orderby排序功能

接一個(gè)或多個(gè)字段對(duì)查詢(xún)結(jié)果進(jìn)行排序

知識(shí)點(diǎn)在本項(xiàng)目案例的運(yùn)用

對(duì)欄目的商品按價(jià)格由高到低或由低到高排序

知識(shí)點(diǎn)的運(yùn)用場(chǎng)合描述

各種排序場(chǎng)合,如取熱點(diǎn)新聞,發(fā)帖狀元等。

多重排序:

Limit在語(yǔ)句的最后起到了限制條目的作用。

Limitoffset,[N]

offset:偏移量,N:條目;如果不寫(xiě),則從頭開(kāi)始寫(xiě)。即:limit

0,N;

Truncatetable清空表

思考:取出每個(gè)欄目下最貴的商品

解法一:

首先建個(gè)臨時(shí)表g2,將goods表導(dǎo)入g2,

此時(shí),g2中每個(gè)欄目的第一個(gè)goods_id就是該欄目下最貴的那

個(gè),再取出每個(gè)欄目下的第一個(gè)。

解法二:

思想類(lèi)似解法一,將select后的結(jié)果看作是一張表。

五.良好的理解模型

1.Where表達(dá)式:把表達(dá)式放在行中,看表達(dá)式是否為

真,

2.歹U:理解成變量,可以運(yùn)算

3.取出結(jié)果:可以理解成一張臨時(shí)表

六.子查詢(xún)

1.Where型子查詢(xún)

2.From型子查詢(xún)

3.Exist型子查詢(xún)

一.Where型子查詢(xún)

是指把內(nèi)層的查詢(xún)結(jié)果作為外層查詢(xún)的比較條件。

二.From型子查詢(xún)

把內(nèi)層的查詢(xún)結(jié)果當(dāng)成表供外層繼續(xù)查詢(xún)

使用了from+where子查詢(xún)。

三.Exists子查詢(xún)

把外層的查詢(xún)結(jié)果拿到內(nèi)層,看內(nèi)層的查詢(xún)是否

成立。

階段總結(jié)二

查select

Where表達(dá)式

表達(dá)式在哪一行成立,哪一行就取出來(lái)

=,\-/<>,>,<,>=,<=,in,betweenand,or,not

Groupby

分組,一般和統(tǒng)計(jì)函數(shù)配合使用

Max,min,avg,sum,count

Having

數(shù)據(jù)在表中,表在硬盤(pán)或內(nèi)存以文件形式存在

Where就是針對(duì)表文件發(fā)揮作用的

查詢(xún)的結(jié)果,也可以看成一張表,其文件一般臨時(shí)存在緩沖區(qū)

針對(duì)查詢(xún)的結(jié)果發(fā)揮作用

Orderby

作用:排序

可以針對(duì)字段,升序[asc],降序【desc】。

有可能一個(gè)字段拍不出結(jié)果,可以選用其他字段繼續(xù)排列

Limit

限制條目

Limit[offset][N]

Offset:偏移量

N:取出條目,取出3-5條,limit2,3.

子查詢(xún)

Where型,內(nèi)層的查詢(xún)結(jié)果作為外層查詢(xún)的比較條件

From型子查詢(xún)

把內(nèi)層的查詢(xún)結(jié)果供外層再次查詢(xún)

注意:內(nèi)層的查詢(xún)結(jié)果看成臨時(shí)表,加as臨時(shí)表名

Exists型子查詢(xún)

把外層的查詢(xún)結(jié)果帶入到內(nèi)層,看內(nèi)層是否成立。

Union:聯(lián)合

作用:把兩次或多次查詢(xún)結(jié)果合并

要求:兩次查詢(xún)的列數(shù)一致。

推薦:查詢(xún)的每一列,相對(duì)應(yīng)的列類(lèi)型也一樣。

可以來(lái)自于多張表。多條sql語(yǔ)句union后的列名以第一個(gè)sql

語(yǔ)句的列名為準(zhǔn)。

例:

利用from型子查詢(xún),并配合sum聚合函數(shù)來(lái)實(shí)現(xiàn)。

如果不同的語(yǔ)句取出的行,有完全相同,(每個(gè)列的值都相同)

那么相同的行將會(huì)合并(去重復(fù))

如果不去重復(fù),可以加all。

如果子句中有orderby,limit,需加()。

推薦排序放到所有子句之后,即對(duì)最終合并的結(jié)果進(jìn)行排序。

在子句中,orderby配合limit使用才有意義。不配合limit

使用,會(huì)被語(yǔ)法分析器優(yōu)化分析時(shí),去除。

連接查詢(xún)概念及左連接語(yǔ)法

子查詢(xún)就是在原有的查詢(xún)語(yǔ)句中,嵌入新的查詢(xún),來(lái)得到我們想

要的結(jié)果集。一般根據(jù)子查詢(xún)的嵌入位置分為,where型子查詢(xún),

from型子查詢(xún)。

學(xué)習(xí)內(nèi)容

左連接,右連接,內(nèi)連接

作用:

從兩張或多張表中取出相關(guān)聯(lián)的數(shù)據(jù)

應(yīng)用案例:

非常廣泛。如取文章及其所在欄目名稱(chēng)

去個(gè)人信息及其所發(fā)布的文章等。

數(shù)據(jù)庫(kù)中以表為單位存儲(chǔ)數(shù)據(jù)。

左連接

以左表為準(zhǔn),去右表找匹配數(shù)據(jù),找不到匹配,用null補(bǔ)齊

右連接

內(nèi)連接

如何記憶:

1.左右連接可以相互轉(zhuǎn)化

2.推薦將右連接轉(zhuǎn)化為左連接,兼容性好一些

3.內(nèi)連接:查詢(xún)左右表都有的數(shù)據(jù),即:不要左右連接中null

的那一部分,是左右連接的交集。

思考:能否查出左右連接的并集呢?

目前不能,目前的mysql不支持外連接??梢允褂胾nion來(lái)

達(dá)到目的。

三表連接

面試題:

回顧建表語(yǔ)句:

Createtable表名(

列名稱(chēng)列類(lèi)型[列屬性][默認(rèn)值],列聲明

列名稱(chēng)列類(lèi)型[列屬性][默認(rèn)值],

列名稱(chēng)列類(lèi)型[列屬性][默認(rèn)值],

列名稱(chēng)列類(lèi)型[列屬性][默認(rèn)值],

)charset=utf8/gbk…

表增加列,修改列,刪除列

增加列:

Altertable表名add列聲明

增加的列默認(rèn)在表的最后一列

可以用after來(lái)聲明新增的列在那一列后面。

Aftertable表名add列聲明after..

如果新增放在最前面?

Aftertable表名add列聲明first

修改列:

Aftertable表名change舊列名列聲明

刪除列:

Altertable表名drop列名

視圖:view

查詢(xún)每個(gè)欄目下最貴的商品

Selectgoods_id,goods_name,cat_id,shop_pricefrom

goodsorderbycat_idascshop_pricedesc;

查詢(xún)結(jié)果當(dāng)成一張表看,

如果某個(gè)查詢(xún)結(jié)果出現(xiàn)的非常頻繁,也就是拿這個(gè)結(jié)果當(dāng)作

子查詢(xún)出現(xiàn)的非常頻繁

Createtableg2likegoods;

Insertintog2select...

上面兩句是想保存一個(gè)查詢(xún)結(jié)果到表里面,供其他查詢(xún)用

視圖的定義:

視圖是有查詢(xún)結(jié)果形成的一張?zhí)摂M表,

視圖的創(chuàng)建語(yǔ)法:

Createview視圖名select語(yǔ)句;

為什么要視圖?

答:

1.可以簡(jiǎn)化查詢(xún),某一個(gè)復(fù)雜的查詢(xún),翻來(lái)覆去的查。

簡(jiǎn)化查詢(xún)的例子:

2.進(jìn)行權(quán)限控制

把表的權(quán)限封閉,但是開(kāi)放相應(yīng)的視圖權(quán)限,視圖里只開(kāi)放

部分?jǐn)?shù)據(jù)。

3.大數(shù)據(jù)分表時(shí)可以用到

比如,表的行數(shù)超過(guò)200萬(wàn)時(shí),就會(huì)變慢

可以把一張表的數(shù)據(jù)拆成四張表來(lái)存放

比如:News表

Newsid,1,2,3,4

Newsl,news2,news3,news4表

把一張表的數(shù)據(jù)分散到四張表里,分散的方法有很多,最常

用的可以用id取模來(lái)計(jì)算(把數(shù)據(jù)均勻的分到幾張表里)

Id%4+1=[1,2,3,4]

比如$_GET['id']=17,17%4+1=2,$tabieName=

'news'.'2'

Select*fromnews2whereid=17;

還可以用視圖,把四張表形成一張視圖

Createviewnewsasselectfromnews2union….

視圖的刪除:

Dropview;

視圖的修改:

Alterviewasselect…

視圖及表的關(guān)系:

視圖的數(shù)據(jù)來(lái)源于表,若表的數(shù)據(jù)改變,則視圖的數(shù)據(jù)自動(dòng)

改變。是表的查詢(xún)結(jié)果。

修改視圖的數(shù)據(jù)時(shí),表的數(shù)據(jù)也會(huì)跟著修改。

但是視圖也并不總是增刪改的,視圖的數(shù)據(jù)及表的數(shù)據(jù)有嚴(yán)

格的一一對(duì)應(yīng)時(shí),可以修改。對(duì)于insert還應(yīng)注意,視圖必

須包含表中沒(méi)有默認(rèn)值的列

視圖的算法algorithm

Algorithm=merge/temptable/underfined

Merge:當(dāng)引用視圖時(shí),引用視圖的語(yǔ)句及定義視圖的語(yǔ)句合

Temptable:當(dāng)引用視圖時(shí),根據(jù)視圖的創(chuàng)建語(yǔ)句建立一個(gè)臨

時(shí)表

Underfined:未定義,

Merge意味著視圖只是一個(gè)規(guī)則,語(yǔ)句規(guī)則,當(dāng)查詢(xún)視圖時(shí),

把查詢(xún)視圖的語(yǔ)句及創(chuàng)建時(shí)的語(yǔ)句等合并,分析,形成一條

語(yǔ)句。

而temptable是根據(jù)創(chuàng)建語(yǔ)句瞬間創(chuàng)建一張臨時(shí)表,然后查

詢(xún)視圖的語(yǔ)句從該臨時(shí)表查數(shù)據(jù)。

字符集

字符集及校對(duì)集

Createtable表名(

列聲明

)charsetutf8;

mysql的字符集設(shè)置非常靈活

可以設(shè)置服務(wù)器默認(rèn)字符集

數(shù)據(jù)庫(kù)默認(rèn)字符集

表默認(rèn)字符集

列字符集

如果某一個(gè)級(jí)別沒(méi)有指定字符集,則繼承上一級(jí),

以表聲明utf8為例:

存儲(chǔ)的數(shù)據(jù)在表中,最終是utf8;

1.告訴服務(wù)器,我發(fā)送的數(shù)據(jù)是什么編碼的。

character_set_client

2.告訴轉(zhuǎn)換器,轉(zhuǎn)換成什么編碼的

charactersetconnection

3.查詢(xún)的結(jié)果用什么編碼character_set_results

如果以上三者都為字符集N,則可以簡(jiǎn)寫(xiě)為

SetnamesN;

推論:什么時(shí)候會(huì)亂碼?

1.Client聲明及事實(shí)不符

2.Result及客戶(hù)端頁(yè)面不符的時(shí)候

什么時(shí)間將會(huì)丟失數(shù)據(jù)?

校對(duì)集:字符集的排序規(guī)則

一個(gè)字符集可以有一個(gè)或者多個(gè)排序規(guī)則

Utf8默認(rèn)utf8_general_ci不區(qū)分大小寫(xiě)

階段總結(jié)(三)

Union的用法

合并查詢(xún)的結(jié)果,取select結(jié)果的并集

對(duì)于重復(fù)的行去掉,如果不去重復(fù),可以用unionall

Union的要求:

各select查出的列數(shù)一致

如果子句中用了orderbylimit

那么子句要用小括號(hào)()抱起來(lái)

如果子句只用orderby沒(méi)有l(wèi)imit

Orderby被優(yōu)化掉,不起作用

左連接、右連接、內(nèi)連接

Selectta.列,tb.列

Taleft/right/innerjointb

011{比列=坨.列(關(guān)系不一定是等于)

Where…

左連接及右連接:

可以相互轉(zhuǎn)化

Aleftbbrighta

內(nèi)連接:innerjoin

左右連接的交集,兩張表能相互匹配上的行

表的管理列的增刪改

給表增加列:

Altertable表名add列聲明[after/first]

修改表的列:

Altertable表名change待修改列名列聲明

刪除別的列:

Altertable表名drop列名

視圖view

視圖是一張?zhí)摂M的表,沒(méi)有真實(shí)的數(shù)據(jù)存在,只是一張及表的一

種查詢(xún)產(chǎn)生的關(guān)系。

語(yǔ)法:

Create[algorithm=merge/temptable/underfined]view

viewnameasselect??,..;

Merge是將創(chuàng)建視圖時(shí)的語(yǔ)句和查詢(xún)視圖的語(yǔ)句合并成一條語(yǔ)

句。

Temptable:是創(chuàng)建一張臨時(shí)表,merge是一條語(yǔ)句,用的時(shí)候

較多。

字符集和校對(duì)集

客戶(hù)端一》【轉(zhuǎn)換器】--》服務(wù)器

客戶(hù)端使用的字符集:setcharacter_set_c1ient=gbk/utf8

轉(zhuǎn)換器轉(zhuǎn)換后的字符集:setcharacter_set_connection=

gbk/utf8

返回給客戶(hù)端的字符集:setcharacter_set_results=

gbk/utf8

總和:setnamesgbk/utf8;

校對(duì)集:就是對(duì)排序的規(guī)則;

一種字符集對(duì)應(yīng)一種或多種校對(duì)集;

Createtable()charsetutf8;

觸發(fā)器:

學(xué)習(xí)目標(biāo):

觸發(fā)器的定義:

觸發(fā)器的應(yīng)用場(chǎng)合:

掌握觸發(fā)器的創(chuàng)建語(yǔ)法:

會(huì)創(chuàng)建簡(jiǎn)單的觸發(fā)器:

1.觸發(fā)器:trigger,(槍擊,扳機(jī),引線(xiàn))見(jiàn)識(shí)某種情況,并

觸發(fā)某種操作。能監(jiān)視增刪改,觸發(fā)操作:增刪改

2.當(dāng)向一張表中添加或刪除記錄時(shí),需要在相關(guān)表中進(jìn)行同步

操作。比如:當(dāng)一個(gè)訂單產(chǎn)生時(shí),訂單所購(gòu)的商品的庫(kù)存量

相應(yīng)減少。

當(dāng)表上某列數(shù)據(jù)的值及其他表中的數(shù)據(jù)有聯(lián)系時(shí)。

比如:當(dāng)某客戶(hù)進(jìn)行欠款消費(fèi),可以在生成訂單時(shí)通過(guò)設(shè)計(jì)

觸發(fā)器判斷該客戶(hù)的累計(jì)欠款是否超過(guò)了最大限度。

當(dāng)需要對(duì)某張表進(jìn)行跟蹤時(shí)。

比如:當(dāng)有新訂單產(chǎn)生時(shí),需要及時(shí)通知相關(guān)人員進(jìn)行處理,

此時(shí)可以在訂單表上設(shè)計(jì)添加觸發(fā)器加以實(shí)現(xiàn)。

3.監(jiān)視地點(diǎn):table,監(jiān)視事件:insert/update/delete,觸發(fā)

時(shí)間:after/before,觸發(fā)事件:insert/update/delete

首先需要修改:

Delimiter$,遇到$結(jié)束語(yǔ)句開(kāi)始執(zhí)行。

創(chuàng)建觸發(fā)器語(yǔ)法:

CreatetriggertriggerName

After/beforeinsert/update/deleteon表名

Foreachrow

Begin

Sql語(yǔ)句

End

刪除觸發(fā)器的語(yǔ)法:

DroptriggertriggerName

如何在觸發(fā)器中引用行的值,

對(duì)于insert而言,新增的行用new來(lái)表示,行中的每一列的

值,用new.列名來(lái)表示。

對(duì)于delete來(lái)說(shuō),原本有一行,后來(lái)被刪除想引用被刪除的

這一行,用。Id來(lái)表示,old列名就可以引用被刪行中的值。

對(duì)于update來(lái)說(shuō),原本有一行,修改后還是那一行,修改前的

數(shù)據(jù)用old來(lái)表示,old列名引用被修改之前行中的值,修改后

的數(shù)據(jù)用new來(lái)表示,new列名引用被修改之前前行中的值,

例:

刪除一個(gè)訂單,庫(kù)存量相應(yīng)增加

修改訂單的數(shù)量時(shí),庫(kù)存相應(yīng)改變

這里只是修改了訂單的數(shù)量,若也要修改gid,即訂單商品類(lèi)

另U,則需要修改觸發(fā)器:

觸發(fā)器里after和before的區(qū)別

After是先完成數(shù)據(jù)的增刪改,再觸發(fā),觸發(fā)中的語(yǔ)句晚于增

刪改,不能對(duì)前面的增刪改產(chǎn)生影響

Before是先完成觸發(fā),再增刪改,觸發(fā)的語(yǔ)句先于監(jiān)視增刪

改,我們有機(jī)會(huì)判斷,修改即將發(fā)生的操作

典型案例:

對(duì)于所下訂單進(jìn)行判斷,如果訂單數(shù)量>5就是認(rèn)為惡意訂單,

強(qiáng)制把所訂的商品數(shù)量改成5

查看所有的觸發(fā)器

Showtriggers;

存儲(chǔ)引擎

表里的數(shù)據(jù)存儲(chǔ)在硬盤(pán)上,具體是如何存儲(chǔ)的?

存儲(chǔ)的方式有很多,同樣的一張表的數(shù)據(jù)對(duì)于用戶(hù)來(lái)說(shuō),無(wú)

論什么樣的存儲(chǔ)引擎,用戶(hù)看到的數(shù)據(jù)是一樣的,對(duì)于服務(wù)

器來(lái)說(shuō)是不同的。

數(shù)據(jù)庫(kù)對(duì)同樣的數(shù)據(jù),有不同的存儲(chǔ)方式和管理方式,在

mysql中,稱(chēng)為存儲(chǔ)引擎。

常用的表的引擎有myisam和innodb

Myisam:批量插入速度快,不支持事務(wù),鎖表

innoDB:批量插入速度相對(duì)較慢,支持事務(wù),鎖行。

全文索引,目前mysql5.5都已經(jīng)支持。

討論innoDB支持事務(wù),myisam不支持事務(wù)。

事務(wù):

事務(wù)的acid特性

通俗的說(shuō),一組操作要么都成功執(zhí)行,要么都不執(zhí)行。原

子性(atomicity)

在所有操作都沒(méi)有執(zhí)行完畢之前,其他會(huì)話(huà)不能夠看到中間

改變的過(guò)程。隔離性(isolation)

事務(wù)發(fā)生之前和發(fā)生之后數(shù)據(jù)的總額依然匹配。一致性

(consistency)

事務(wù)產(chǎn)生的影響不能夠撤銷(xiāo)持久性(durability)

如果出現(xiàn)了錯(cuò)誤,事務(wù)也不允許撤銷(xiāo),只能夠“補(bǔ)償事務(wù)”

原子性體現(xiàn)的是不可分割性,不可見(jiàn)性。

轉(zhuǎn)賬

李三支出500,李三-500

趙四收到500,趙四+500

關(guān)于事務(wù)的引擎:選用innoDB/bdb

查看mysql服務(wù)器的模式:

Showvariableslike'zmodez’;

語(yǔ)法:

開(kāi)啟事務(wù):

Sql…

Sql…

Commit

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論