《數(shù)據(jù)庫(kù)原理與應(yīng)用》課件第5章 2_第1頁(yè)
《數(shù)據(jù)庫(kù)原理與應(yīng)用》課件第5章 2_第2頁(yè)
《數(shù)據(jù)庫(kù)原理與應(yīng)用》課件第5章 2_第3頁(yè)
《數(shù)據(jù)庫(kù)原理與應(yīng)用》課件第5章 2_第4頁(yè)
《數(shù)據(jù)庫(kù)原理與應(yīng)用》課件第5章 2_第5頁(yè)
已閱讀5頁(yè),還剩149頁(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)介

第5章數(shù)據(jù)表設(shè)計(jì)5.1關(guān)系的規(guī)范化5.2數(shù)據(jù)類(lèi)型5.3數(shù)據(jù)字典的書(shū)寫(xiě)5.4創(chuàng)建數(shù)據(jù)表5.5查看數(shù)據(jù)表信息5.6修改數(shù)據(jù)表及設(shè)置完整性約束5.7刪除數(shù)據(jù)表【小結(jié)】【習(xí)題】

5.1關(guān)系的規(guī)范化

在需求分析階段解決了客戶(hù)的業(yè)務(wù)和數(shù)據(jù)處理需求之后,就進(jìn)入了概要設(shè)計(jì)階段,需要和項(xiàng)目團(tuán)隊(duì)的其他成員以及客戶(hù)溝通,討論數(shù)據(jù)庫(kù)設(shè)計(jì)是否滿(mǎn)足客戶(hù)業(yè)務(wù)和數(shù)據(jù)處理需求。然而,有人曾開(kāi)玩笑說(shuō),同一個(gè)項(xiàng)目,10個(gè)設(shè)計(jì)人員會(huì)設(shè)計(jì)出10種不同的E-R圖。不錯(cuò),不同的人從不同的角度,標(biāo)識(shí)出不同的實(shí)體,實(shí)體又包含著不同的屬性,自然就會(huì)設(shè)計(jì)出不同的E-R圖。那么怎樣審核這些設(shè)計(jì)圖呢,怎樣評(píng)審出最優(yōu)的設(shè)計(jì)方案呢?所以,下一步工作就是規(guī)范化E-R圖。5.1.1函數(shù)依賴(lài)

1.問(wèn)題提出

函數(shù)依賴(lài)用于說(shuō)明在一個(gè)關(guān)系中屬性之間的相互聯(lián)系的情況。如果作為關(guān)鍵字的屬性或?qū)傩越M合對(duì)關(guān)系中的其他屬性具有決定作用,則其他屬性對(duì)作為關(guān)鍵字的屬性或?qū)傩越M合就存在著依賴(lài)。在關(guān)系數(shù)據(jù)庫(kù)理論中就把這種依賴(lài)稱(chēng)為函數(shù)依賴(lài)。

為了說(shuō)明的方便,下面先看一個(gè)實(shí)例。例5.1

設(shè)有一個(gè)關(guān)于學(xué)生成績(jī)管理的關(guān)系模式R(U),其中U由屬性SNo、SName、SSex、PName、Cname、TName、Grade組成的屬性集合。其中SNo的含義為學(xué)生學(xué)號(hào),SName為學(xué)生姓名,SSex為學(xué)生性別,PName為學(xué)生所在系別,CName為學(xué)生所選的課程名稱(chēng),TName為任課教師姓名,Grade為學(xué)生選修該門(mén)課程的成績(jī)。若將這些信息設(shè)計(jì)成一個(gè)關(guān)系,則關(guān)系模式為

教學(xué)(Sno,Sname,Ssex,Pname,Cname,Tname,Grade)

選定此關(guān)系的主鍵為(Sno,Cname)。

該關(guān)系的部分?jǐn)?shù)據(jù)如表5-1所示。不難看出,該關(guān)系存在著如下問(wèn)題。

1)數(shù)據(jù)冗余(DataRedundancy)

(1)每一個(gè)系名對(duì)該系的學(xué)生人數(shù)?×?每個(gè)學(xué)生選修的課程門(mén)數(shù)重復(fù)存儲(chǔ)。

(2)每一個(gè)課程名均對(duì)選修該門(mén)課程的學(xué)生重復(fù)存儲(chǔ)。

(3)每一個(gè)教師都對(duì)其所教的學(xué)生重復(fù)存儲(chǔ)。

2)更新異常(UpdateAnomalies)

由于存在數(shù)據(jù)冗余,就可能導(dǎo)致數(shù)據(jù)更新異常,這主要表現(xiàn)在以下幾個(gè)方面:

(1)插入異常(InsertAnomalies):由于主鍵中元素的屬性值不能取空值,因此如果新分配來(lái)一位教師或新成立一個(gè)系,則這位教師及新系名就無(wú)法插入;如果一位教師所開(kāi)的課程無(wú)人選修或一門(mén)課程列入計(jì)劃但目前不開(kāi)課,則也無(wú)法插入。

(2)修改異常(ModificationAnomalies):如果更改一門(mén)課程的任課教師,則需要修改多個(gè)元組。如果僅部分修改,部分不修改,則會(huì)造成數(shù)據(jù)的不一致性。同樣的情形,如果一個(gè)學(xué)生轉(zhuǎn)系,則對(duì)應(yīng)此學(xué)生的所有元組都必須修改,否則,也會(huì)出現(xiàn)數(shù)據(jù)的不一致性。

(3)刪除異常(DeletionAnomalies):如果某系的所有學(xué)生全部畢業(yè),又沒(méi)有在讀生及新生,則當(dāng)從表中刪除畢業(yè)學(xué)生的選課信息時(shí),則連同此系的信息將全部丟失。同樣地,如果所有學(xué)生都退選一門(mén)課程,則該課程的相關(guān)信息也同樣丟失了。

由此可見(jiàn),上述的學(xué)生成績(jī)關(guān)系盡管看起來(lái)能滿(mǎn)足一定的需求,但存在的問(wèn)題太多,從而它并不是一個(gè)合理的關(guān)系模式。不合理的關(guān)系模式最突出的問(wèn)題是數(shù)據(jù)冗余。而數(shù)據(jù)冗余的產(chǎn)生有著較為復(fù)雜的原因,雖然關(guān)系模式充分地考慮到文件之間的相互關(guān)聯(lián)而有效地處理了多個(gè)文件間的聯(lián)系所產(chǎn)生的冗余問(wèn)題,但在關(guān)系本身內(nèi)部數(shù)據(jù)之間的聯(lián)系還沒(méi)有得到充分的解決。正如例5.1所示,同一關(guān)系模式中各個(gè)屬性之間存在著某種聯(lián)系,如學(xué)生與系、課程與教師之間存在依賴(lài)關(guān)系的事實(shí),才使得數(shù)據(jù)出現(xiàn)大量冗余,引發(fā)各種操作異常。這種依賴(lài)關(guān)系稱(chēng)為數(shù)據(jù)依賴(lài)(DataIndependence)。

2.函數(shù)依賴(lài)概念

函數(shù)依賴(lài)是從數(shù)學(xué)角度來(lái)定義的,在關(guān)系中用來(lái)刻畫(huà)關(guān)系各屬性之間相互制約而又相互依賴(lài)的情況。函數(shù)依賴(lài)普遍存在于現(xiàn)實(shí)生活中。比如描述一個(gè)學(xué)生的關(guān)系,可以有學(xué)號(hào)、姓名、系別等多個(gè)屬性,由于一個(gè)學(xué)號(hào)對(duì)應(yīng)一個(gè)且僅一個(gè)學(xué)生,一個(gè)學(xué)生就讀于一個(gè)確定的系,因而當(dāng)“學(xué)號(hào)”屬性的值確定之后,“姓名”及“系別”的值也就唯一地確定了,此時(shí),就可以稱(chēng)“姓名”和“系別”函數(shù)依賴(lài)于“學(xué)號(hào)”,或者說(shuō)“學(xué)號(hào)”函數(shù)決定“姓名”和“系別”,記作:學(xué)號(hào)→姓名、學(xué)號(hào)→系別。下面對(duì)函數(shù)依賴(lài)給出確切的定義。

定義:設(shè)U{A1,A2,…,An}是屬性集合,R(U)是U上的一個(gè)關(guān)系,x、y是U的子集。若對(duì)于R(U)下的任何一個(gè)可能的關(guān)系,均有x的一個(gè)值對(duì)應(yīng)于y的唯一具體值,則稱(chēng)y函數(shù)依賴(lài)于x,記作x→y。其中x稱(chēng)為決定因素。進(jìn)而若再有y→x,則稱(chēng)x與y相互依賴(lài),記作x←→y。

函數(shù)依賴(lài)和其他數(shù)據(jù)依賴(lài)一樣,是語(yǔ)義范疇的概念。只能根據(jù)數(shù)據(jù)的語(yǔ)義來(lái)確定函數(shù)依賴(lài)。例如,知道了學(xué)生的學(xué)號(hào),可以唯一地查詢(xún)到其對(duì)應(yīng)的姓名、性別等,因而,可以說(shuō)“學(xué)號(hào)函數(shù)確定了姓名或性別”,記作“學(xué)號(hào)→姓名”、“性別”等。這里的唯一性并非只有一個(gè)元組,而是指任何元組,只要它在X(學(xué)號(hào))上相同,則在Y(姓名或性別)上的值也相同。如果滿(mǎn)足不了這個(gè)條件,就不能說(shuō)它們是函數(shù)依賴(lài)了。例如,學(xué)生姓名與年齡的關(guān)系,當(dāng)只有在沒(méi)有同名人的情況下可以說(shuō)函數(shù)依賴(lài)“姓名→年齡”成立,如果允許有相同的名字,則“年齡”就不再依賴(lài)于“姓名”了。函數(shù)依賴(lài)還可細(xì)分為多種,下面分別介紹。

3.部分函數(shù)依賴(lài)

設(shè)R(U)是屬性集U上的關(guān)系,x、y是U的子集,x'是x的真子集,若x→y且x’→y,則稱(chēng)y部分依賴(lài)x,記作X→PY。顯然,當(dāng)且僅當(dāng)x為復(fù)合屬性組時(shí),才有可能出現(xiàn)部分函數(shù)依賴(lài)。

例如表5-2中,顯然有課程號(hào)→課程名,課程號(hào)→開(kāi)課專(zhuān)業(yè)。從另一角度看,只要課程號(hào)一定,同時(shí)課程名確定,開(kāi)課專(zhuān)業(yè)也就唯一確定了,因此課程號(hào)+課程名→開(kāi)課專(zhuān)業(yè)代碼。但它與前述課程號(hào)→開(kāi)課專(zhuān)業(yè)代碼是不同的,因?yàn)閧課程號(hào),課程名}存在真子集:課程號(hào),課程號(hào)→開(kāi)課專(zhuān)業(yè)代碼,把課程號(hào)+課程名→開(kāi)課專(zhuān)業(yè)代碼稱(chēng)為“開(kāi)課專(zhuān)業(yè)代碼”部分函數(shù)依賴(lài)于課程號(hào)?+?課程名。

4.完全函數(shù)依賴(lài)

設(shè)R(U)是屬性集U上的關(guān)系,x、y是U的子集,x'是x的真子集。若對(duì)于R(U)的任何一個(gè)可能的關(guān)系,有x→y且x'→y,則稱(chēng)y完全函數(shù)依賴(lài)于x,記作X→FY。

所謂完全依賴(lài),是指在依賴(lài)關(guān)系的決定項(xiàng)(即依賴(lài)關(guān)系的左項(xiàng))中沒(méi)有多余屬性,而有多余屬性就是部分依賴(lài)。

例如設(shè)關(guān)系模式R,R=R(學(xué)號(hào),姓名,課程號(hào),成績(jī)),易知:

“(學(xué)號(hào),課程號(hào))→成績(jī)”是R的一個(gè)部分依賴(lài)關(guān)系。因此有決定項(xiàng)的真子集(學(xué)號(hào),課程號(hào)),使得“(學(xué)號(hào),課程號(hào))→成績(jī)”成立,且“學(xué)號(hào)→成績(jī)”或“課程號(hào)→成績(jī)”成立,則“(學(xué)號(hào),課程號(hào))→成績(jī)”是R的一個(gè)完全依賴(lài)關(guān)系。

5.傳遞函數(shù)依賴(lài)

設(shè)R(U)是屬性集U上的關(guān)系,x、y、z是U的子集,在R(U)中,有x→y且y→x,若有y→z,x→z,則稱(chēng)z傳遞函數(shù)依賴(lài)于x,記作X→TZ。

例如在一個(gè)學(xué)校中,每門(mén)課均是某一位教師教,但有些教師可教多門(mén)課,則有關(guān)系“教學(xué)”,如表5-3所示。

由以上關(guān)系不難分析,課程名→職工號(hào)、職工號(hào)→課程名,但職工號(hào)和其他屬性的函數(shù)關(guān)系中都是決定因素,即職工號(hào)→教師名、職工號(hào)→職稱(chēng),在這種情況下,教師名、職稱(chēng)傳遞函數(shù)依賴(lài)于課程名。5.1.2范式

數(shù)據(jù)庫(kù)的設(shè)計(jì)范式是數(shù)據(jù)庫(kù)設(shè)計(jì)所需要滿(mǎn)足的規(guī)范,滿(mǎn)足這些規(guī)范的數(shù)據(jù)庫(kù)是簡(jiǎn)潔的、結(jié)構(gòu)明晰的,同時(shí),不會(huì)發(fā)生插入(INSERT)、刪除(DELETE)和更新(UPDATE)操作異常。

1.第一范式(1NF)

在任何一個(gè)關(guān)系數(shù)據(jù)庫(kù)中,第一范式(1NF)都是對(duì)關(guān)系模式的基本要求,不滿(mǎn)足第一范式(1NF)的數(shù)據(jù)庫(kù)就不是關(guān)系數(shù)據(jù)庫(kù)。

所謂第一范式(1NF),是指數(shù)據(jù)庫(kù)表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值,即實(shí)體中的某個(gè)屬性不能有多個(gè)值或者不能有重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性,就可能需要定義一個(gè)新的實(shí)體,新的實(shí)體由重復(fù)的屬性構(gòu)成,新實(shí)體與原實(shí)體之間為一對(duì)多關(guān)系。在第一范式(1NF)中表的每一行只包含一個(gè)實(shí)例的信息。例如,對(duì)于學(xué)生基本信息表,不能將學(xué)生信息都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;學(xué)生基本信息表的每一行只表示一個(gè)學(xué)生的信息,一個(gè)學(xué)生的信息在表中只出現(xiàn)一次。簡(jiǎn)而言之,第一范式就是無(wú)重復(fù)的列。這個(gè)單一屬性由基本類(lèi)型構(gòu)成,包括整型、實(shí)數(shù)、字符型、邏輯型、日期型等。不滿(mǎn)足1NF的關(guān)系稱(chēng)為非規(guī)范化關(guān)系。

在關(guān)系數(shù)據(jù)庫(kù)中不允許非規(guī)范化關(guān)系的存在。例如,如下的數(shù)據(jù)庫(kù)表是符合第一范式的:而下面這樣的數(shù)據(jù)庫(kù)表是不符合第一范式的:很明顯,在當(dāng)前的任何關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中,任何人都不可能做出不符合第一范式的數(shù)據(jù)庫(kù),因?yàn)檫@些DBMS不允許把數(shù)據(jù)庫(kù)表的一列再分成兩列或多列。因此,想在現(xiàn)有的DBMS中設(shè)計(jì)出不符合第一范式的數(shù)據(jù)庫(kù)是不可能的。

注意:任何一個(gè)關(guān)系模式都屬于1NF,不滿(mǎn)足第一范式的數(shù)據(jù)庫(kù)模式不能稱(chēng)為關(guān)系數(shù)據(jù)庫(kù)。

2.第二范式(2NF)

第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來(lái)的,即滿(mǎn)足第二范式(2NF)必須先滿(mǎn)足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或行必須可以被唯一地區(qū)分。為實(shí)現(xiàn)區(qū)分,通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的唯一標(biāo)識(shí)。如學(xué)生基本信息表中加上了學(xué)號(hào)(SNo)列,因?yàn)槊總€(gè)學(xué)生的編號(hào)是唯一的,因此每個(gè)學(xué)生可以被唯一區(qū)分。這個(gè)唯一屬性列被稱(chēng)為主關(guān)鍵字或主鍵或主碼。第二范式(2NF)要求實(shí)體的屬性完全依賴(lài)于主關(guān)鍵字。所謂完全依賴(lài),是指不能存在僅依賴(lài)主關(guān)鍵字一部分的屬性,如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來(lái)形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對(duì)多的關(guān)系。為實(shí)現(xiàn)區(qū)分,通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的唯一標(biāo)識(shí)。簡(jiǎn)而言之,第二范式就是非主屬性非部分依賴(lài)于主關(guān)鍵字。

假定選課關(guān)系表為StudentScore(學(xué)號(hào),姓名,年齡,課程名稱(chēng),成績(jī),開(kāi)設(shè)學(xué)期),關(guān)鍵字為組合關(guān)鍵字(學(xué)號(hào),課程名稱(chēng))(組合關(guān)鍵字通俗解釋?zhuān)宏P(guān)鍵字由多個(gè)屬性組成,某非關(guān)鍵字屬性只依賴(lài)于關(guān)鍵字屬性組中的部分屬性),因?yàn)榇嬖谌缦聸Q定關(guān)系:

(學(xué)號(hào),課程名稱(chēng))→(姓名,年齡,成績(jī),開(kāi)設(shè)學(xué)期)

這個(gè)數(shù)據(jù)庫(kù)表不滿(mǎn)足第二范式,因?yàn)榇嬖谌缦聸Q定關(guān)系:

(課程名稱(chēng))→(開(kāi)設(shè)學(xué)期)

(學(xué)號(hào))→(姓名,年齡)

即存在組合關(guān)鍵字中的字段決定非關(guān)鍵字的情況。由于不符合2NF,因而這個(gè)選課關(guān)系表會(huì)存在如下問(wèn)題:

(1)數(shù)據(jù)冗余:同一門(mén)課程由n個(gè)學(xué)生選修,學(xué)分就重復(fù)n-1次;同一個(gè)學(xué)生選修了m門(mén)課程,姓名和年齡就重復(fù)了m-1次。

(2)更新異常:若調(diào)整了某門(mén)課程的開(kāi)設(shè)學(xué)期,則數(shù)據(jù)表中所有行的開(kāi)設(shè)學(xué)期值都要更新,否則會(huì)出現(xiàn)同一門(mén)課程開(kāi)設(shè)學(xué)期不同的情況。

(3)插入異常:假設(shè)要開(kāi)設(shè)一門(mén)新的課程,暫時(shí)還沒(méi)有人選修。這樣,由于還沒(méi)有學(xué)號(hào)關(guān)鍵字,課程名稱(chēng)和開(kāi)設(shè)學(xué)期就無(wú)法記錄入數(shù)據(jù)庫(kù)。

(4)刪除異常:假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫(kù)表中刪除。但是,與此同時(shí),課程名稱(chēng)和開(kāi)設(shè)學(xué)期信息也被刪除了。顯然,這也會(huì)導(dǎo)致插入

異常。把選課關(guān)系表StudentScore改為如下三個(gè)表:

學(xué)生:StudentInformation(學(xué)號(hào),姓名,年齡);

課程:CourseInformation(課程名稱(chēng),開(kāi)設(shè)學(xué)期);

選課關(guān)系:StudentScore(學(xué)號(hào),課程名稱(chēng),成績(jī))。

這樣的數(shù)據(jù)庫(kù)表是符合第二范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。另外,所有單關(guān)鍵字的數(shù)據(jù)庫(kù)表都符合第二范式,因?yàn)椴豢赡艽嬖诮M合關(guān)鍵字。

3.第三范式(3NF)

滿(mǎn)足第三范式(3NF)必須先滿(mǎn)足第二范式(2NF)。簡(jiǎn)而言之,第三范式(3NF)要求一個(gè)數(shù)據(jù)庫(kù)表中不包含已在其他表中已包含的非主關(guān)鍵字信息。例如,存在一個(gè)專(zhuān)業(yè)信息表,其中每個(gè)專(zhuān)業(yè)有專(zhuān)業(yè)編號(hào)(PId)、專(zhuān)業(yè)名稱(chēng)、專(zhuān)業(yè)簡(jiǎn)介等信息。那么在學(xué)生基本信息表中列出專(zhuān)業(yè)編號(hào)后就不能再將專(zhuān)業(yè)名稱(chēng)、專(zhuān)業(yè)簡(jiǎn)介等與專(zhuān)業(yè)有關(guān)的信息再加入學(xué)生基本信息表中。如果不存在專(zhuān)業(yè)信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會(huì)有大量的數(shù)據(jù)冗余。簡(jiǎn)而言之,第三范式就是屬性不依賴(lài)于其他非主屬性。假定學(xué)生成績(jī)關(guān)系表為:StudentInformation(學(xué)號(hào),姓名,性別,課程號(hào),課程名,開(kāi)設(shè)學(xué)期,成績(jī)),關(guān)鍵字為單一關(guān)鍵字“學(xué)號(hào)”,因?yàn)榇嬖谌缦聸Q定關(guān)系:

(學(xué)號(hào))→(姓名,性別,課程號(hào),課程名,開(kāi)設(shè)學(xué)期,成績(jī))

所以這個(gè)數(shù)據(jù)庫(kù)是符合2NF的,但是不符合3NF,因?yàn)榇嬖谌缦聸Q定關(guān)系:

(學(xué)號(hào))→(課程號(hào))→(課程名,開(kāi)設(shè)學(xué)期)即存在非關(guān)鍵字段“課程名”、“開(kāi)設(shè)學(xué)期”對(duì)關(guān)鍵字段“學(xué)號(hào)”的傳遞函數(shù)依賴(lài)。它也會(huì)存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況。把學(xué)生成績(jī)關(guān)系表分為如下兩個(gè)表:

學(xué)生成績(jī):(學(xué)號(hào),姓名,性別,課程號(hào),成績(jī));

課程:(課程號(hào),課程名,開(kāi)設(shè)學(xué)期)。

這樣的數(shù)據(jù)庫(kù)表是符合第三范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。5.1.3關(guān)系的規(guī)范化

關(guān)系模式的規(guī)范化過(guò)程是通過(guò)對(duì)關(guān)系模式的分解來(lái)實(shí)現(xiàn)的。把低一級(jí)的關(guān)系模式分解為若干個(gè)高一級(jí)的關(guān)系模式。這種分解不是唯一的。

一個(gè)低級(jí)范式的關(guān)系模式,通過(guò)分解(投影)方法可轉(zhuǎn)換成多個(gè)高一級(jí)范式的關(guān)系模式的集合,這種過(guò)程稱(chēng)為規(guī)范化,如圖5-1所示。圖5-1規(guī)范化步驟規(guī)范化的方式是進(jìn)行模式分解,模式分解的原則是與原模式等價(jià),模式分解的標(biāo)準(zhǔn)如下:

①模式分解具有無(wú)損連接性;

②模式分解能夠保持函數(shù)依賴(lài)。

規(guī)范化程度過(guò)低的關(guān)系可能會(huì)存在插入異常、刪除異常、修改復(fù)雜、數(shù)據(jù)冗余等問(wèn)題,需要對(duì)其進(jìn)行規(guī)范化,轉(zhuǎn)換成高級(jí)范式。但這并不意味著規(guī)范化程度越高的關(guān)系模式就越好。在設(shè)計(jì)數(shù)據(jù)庫(kù)模式結(jié)構(gòu)時(shí),必須以現(xiàn)實(shí)世界的實(shí)際情況和用戶(hù)應(yīng)用需求作進(jìn)一步分析,確定一個(gè)合適的、能夠反映現(xiàn)實(shí)世界的模式。即上面的規(guī)范化步驟可以在其中任何一步終止。

5.2數(shù)據(jù)類(lèi)型

創(chuàng)建了用戶(hù)數(shù)據(jù)庫(kù)之后,接下來(lái)的工作就是創(chuàng)建數(shù)據(jù)表。因?yàn)橐褂脭?shù)據(jù)庫(kù),就需要數(shù)據(jù)庫(kù)中某種對(duì)象能夠存儲(chǔ)用戶(hù)輸入的各種數(shù)據(jù),這種對(duì)象就是數(shù)據(jù)表。以后使用數(shù)據(jù)庫(kù)完成的各種應(yīng)用也是在數(shù)據(jù)表的基礎(chǔ)上完成的。所以數(shù)據(jù)表是數(shù)據(jù)庫(kù)中最重要的對(duì)象。

數(shù)據(jù)表被定義為列的集合。它與電子表格類(lèi)似,數(shù)據(jù)在表中是按照行和列的格式來(lái)組織排列的。每行代表一個(gè)唯一的記錄,每列代表記錄中的一個(gè)域。例如一個(gè)包含學(xué)生基本信息的數(shù)據(jù)表,表中的每一行代表一個(gè)學(xué)生,每一列分別表示學(xué)生詳細(xì)資料中的一項(xiàng),如學(xué)號(hào)、姓名、專(zhuān)業(yè)、班級(jí)等。在為一個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)表之前,應(yīng)考慮該數(shù)據(jù)庫(kù)中要存放的數(shù)據(jù)以及數(shù)據(jù)如何劃分到表中。例如,“學(xué)生信息管理系統(tǒng)”數(shù)據(jù)庫(kù)需要存儲(chǔ)學(xué)生基本信息、教師基本信息、學(xué)生成績(jī)信息等,而在“學(xué)生基本信息”中將存儲(chǔ)學(xué)生的詳細(xì)信息(即“StudentInformation”表)、學(xué)生成績(jī)信息(即“StudentScore”)、教師基本信息(即“TeacherInformation”表)、課程信息(即“CourseInformation”表)、班級(jí)信息(即“ClassInformation”表)。具體對(duì)于某一個(gè)表,在創(chuàng)建之前,最好先在紙上畫(huà)出其輪廓。此時(shí)要考慮每個(gè)表中的內(nèi)容包括:

①表中要存儲(chǔ)的數(shù)據(jù)類(lèi)型;

②表中需要的列以及每一列的類(lèi)型;③列是否可以為空;

④列的長(zhǎng)度;

⑤是否需要在列上使用約束、默認(rèn)值和規(guī)則;

⑥需要使用什么樣的索引;

⑦哪些列作為主鍵。

在創(chuàng)建表的時(shí)候,會(huì)涉及數(shù)據(jù)表結(jié)構(gòu)的重要問(wèn)題,也就是涉及到確定數(shù)據(jù)表中的各列數(shù)據(jù)的格式是數(shù)值、字符、日期還是貨幣、圖像等其他格式的數(shù)據(jù)。因?yàn)橹挥性O(shè)計(jì)好了數(shù)據(jù)表中的各列應(yīng)該填寫(xiě)什么格式的數(shù)據(jù),系統(tǒng)才會(huì)在磁盤(pán)上開(kāi)辟相應(yīng)的空間,用戶(hù)才能向表中填寫(xiě)數(shù)據(jù)。因此在講述數(shù)據(jù)表的操作前必須重點(diǎn)介紹SQLServer的數(shù)據(jù)類(lèi)型。

在SQLServer數(shù)據(jù)表中,列的數(shù)據(jù)類(lèi)型既可以是系統(tǒng)提供的數(shù)據(jù)類(lèi)型,也可以是用戶(hù)自定義的數(shù)據(jù)類(lèi)型。5.2.1系統(tǒng)提供的數(shù)據(jù)類(lèi)型

SQLServer系統(tǒng)提供了豐富的數(shù)據(jù)類(lèi)型,如表5-4所示。

SQLServer中的每個(gè)列,本地變量、表達(dá)式和參數(shù)都有一個(gè)相關(guān)的數(shù)據(jù)類(lèi)型。一般情況下,SQLServer提供的基本數(shù)據(jù)類(lèi)型主要用于定義內(nèi)存單元的數(shù)量,以便指定信息、大小和存儲(chǔ)格式的類(lèi)型,存儲(chǔ)列的格式,存儲(chǔ)過(guò)程參數(shù)和本地變量。

例如,對(duì)于存儲(chǔ)學(xué)生基本信息有如下說(shuō)明:

學(xué)號(hào)、姓名、地址、郵編、電話號(hào)碼等信息一般使用字符數(shù)據(jù)類(lèi)型存儲(chǔ)。

性別(男/女)一般可以使用字符數(shù)據(jù)類(lèi)型存儲(chǔ),也可以使用bit數(shù)據(jù)類(lèi)型來(lái)存儲(chǔ)。

出生日期一般使用日期數(shù)據(jù)類(lèi)型存儲(chǔ)。

照片使用image數(shù)據(jù)類(lèi)型存儲(chǔ)。

入學(xué)分?jǐn)?shù)一般使用數(shù)值數(shù)據(jù)類(lèi)型存儲(chǔ)。5.2.2用戶(hù)自定義數(shù)據(jù)類(lèi)型

用戶(hù)自定義數(shù)據(jù)類(lèi)型是基于SQLServer的系統(tǒng)提供數(shù)據(jù)類(lèi)型。當(dāng)多個(gè)表的列中要存儲(chǔ)同樣數(shù)據(jù)類(lèi)型,且想確保這些列具有完全相同的數(shù)據(jù)類(lèi)型、長(zhǎng)度和是否為空屬性時(shí),可使用戶(hù)定義類(lèi)型。

創(chuàng)建用戶(hù)定義類(lèi)型的數(shù)據(jù)類(lèi)型必須提供以下三個(gè)參數(shù):數(shù)據(jù)類(lèi)型名稱(chēng)、新數(shù)據(jù)類(lèi)型所依據(jù)的系統(tǒng)數(shù)據(jù)類(lèi)型、數(shù)據(jù)類(lèi)型是否為空值(如果未定義,系統(tǒng)將依據(jù)數(shù)據(jù)庫(kù)或連接的ANSINULL默認(rèn)設(shè)置進(jìn)行指派)??梢岳肧SMS和T-SQL命令語(yǔ)句兩種方法來(lái)創(chuàng)建用戶(hù)定義類(lèi)型。下面創(chuàng)建一個(gè)名為birthday,基于smalldatetime,且該列不允許為空值的用戶(hù)定義數(shù)據(jù)類(lèi)型。以后在設(shè)計(jì)某些數(shù)據(jù)表中的“出生年月”列時(shí)就可應(yīng)用此用戶(hù)定義數(shù)據(jù)類(lèi)型。

1.使用SSMS創(chuàng)建用戶(hù)定義數(shù)據(jù)類(lèi)型

首先在管理控制臺(tái)左側(cè)的【對(duì)象資源管理器】中單擊數(shù)據(jù)庫(kù)下的【可編程性】節(jié)點(diǎn),并單擊【類(lèi)型】節(jié)點(diǎn)下的【用戶(hù)定義數(shù)據(jù)類(lèi)型】,可以看到上述SQL語(yǔ)句生成的自定義數(shù)據(jù)類(lèi)型。在SSMS中展開(kāi)要?jiǎng)?chuàng)建用戶(hù)定義數(shù)據(jù)類(lèi)型的數(shù)據(jù)庫(kù),右擊“用戶(hù)定義的數(shù)據(jù)類(lèi)型”,在彈出的快捷菜單中,單擊“新建定義數(shù)據(jù)類(lèi)型”子菜單,如圖5-2所示。圖5-2新建用戶(hù)定義數(shù)據(jù)類(lèi)型在彈出的“用戶(hù)定義的數(shù)據(jù)類(lèi)型屬性”對(duì)話框中,輸入新建數(shù)據(jù)類(lèi)型的名稱(chēng)——birthday,并在“數(shù)據(jù)類(lèi)型”列表中選擇所基于的系統(tǒng)數(shù)據(jù)類(lèi)型——smalldatetime,如圖5-3所示。在“精度”欄中可以更改此數(shù)據(jù)類(lèi)型可存儲(chǔ)的最大數(shù)據(jù)長(zhǎng)度。長(zhǎng)度可變的數(shù)據(jù)類(lèi)型有:binary、varchar、nvarchar、varbirthday等。如果允許此數(shù)據(jù)類(lèi)型接受空值,可選擇“允許空值”,這里創(chuàng)建的數(shù)據(jù)類(lèi)型不能為空,所以在這里就不勾選。在對(duì)話框上的“規(guī)則”和“默認(rèn)值”列表中選擇一個(gè)規(guī)則或默認(rèn)值以綁定到用戶(hù)定義的數(shù)據(jù)類(lèi)型上,這里不選。圖5-3用戶(hù)定義數(shù)據(jù)類(lèi)型屬性對(duì)話框最后單擊【確定】按鈕,創(chuàng)建用戶(hù)定義數(shù)據(jù)類(lèi)型完畢。此時(shí)查看“對(duì)象資源管理器”,就可以發(fā)現(xiàn)系統(tǒng)中已有剛才創(chuàng)建的birthday的數(shù)據(jù)類(lèi)型,如圖5-4所示。圖5-4用戶(hù)定義數(shù)據(jù)類(lèi)型birthday結(jié)果

2.刪除用戶(hù)定義的數(shù)據(jù)類(lèi)型

如圖5-5所示,右擊“用戶(hù)定義的數(shù)據(jù)類(lèi)型”下的數(shù)據(jù)類(lèi)型,單擊“刪除”子菜單。在如圖5-6所示刪除對(duì)象對(duì)話框中,單擊【確定】按鈕,就可以完成刪除用戶(hù)定義的數(shù)據(jù)類(lèi)型。圖5-5刪除用戶(hù)定義數(shù)據(jù)類(lèi)型圖5-6刪除對(duì)象對(duì)話框

5.3數(shù)據(jù)字典的書(shū)寫(xiě)

對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)來(lái)講,數(shù)據(jù)字典(Datadictionary)是進(jìn)行數(shù)據(jù)收集和分析所獲得的各類(lèi)數(shù)據(jù)描述的集合,通常包括數(shù)據(jù)項(xiàng)、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)流、數(shù)據(jù)存儲(chǔ)和處理過(guò)程五個(gè)部分。數(shù)據(jù)流圖配以數(shù)據(jù)字典,就可以從圖形和文字兩個(gè)方面對(duì)系統(tǒng)的邏輯模型進(jìn)行完整的描述。

1.?dāng)?shù)據(jù)項(xiàng)

數(shù)據(jù)項(xiàng)又稱(chēng)數(shù)據(jù)元素,是數(shù)據(jù)的最小單位。分析數(shù)據(jù)特性應(yīng)從靜態(tài)和動(dòng)態(tài)兩個(gè)方面去進(jìn)行。在數(shù)據(jù)字典中,僅定義數(shù)據(jù)的靜態(tài)特性,具體包括:

①數(shù)據(jù)項(xiàng)的名稱(chēng)、編號(hào)、別名和簡(jiǎn)述;

②數(shù)據(jù)項(xiàng)的長(zhǎng)度;

③數(shù)據(jù)項(xiàng)的取值范圍。

數(shù)據(jù)項(xiàng)描述={數(shù)據(jù)項(xiàng)名,數(shù)據(jù)項(xiàng)含義說(shuō)明,別名,數(shù)據(jù)類(lèi)型,長(zhǎng)度,

取值范圍,取值含義,與其他數(shù)據(jù)項(xiàng)的邏輯關(guān)系}

其中,取值范圍及與其他數(shù)據(jù)項(xiàng)的邏輯關(guān)系定義了數(shù)據(jù)的完整性約束條件,是設(shè)計(jì)數(shù)據(jù)功能的依據(jù)。

2.?dāng)?shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)反映了數(shù)據(jù)之間的組合關(guān)系。一個(gè)數(shù)據(jù)結(jié)構(gòu)可以由若干個(gè)數(shù)據(jù)項(xiàng)組成,也可以由若干個(gè)數(shù)據(jù)結(jié)構(gòu)組成,或由若干個(gè)數(shù)據(jù)項(xiàng)和數(shù)據(jù)結(jié)構(gòu)混合而成。對(duì)數(shù)據(jù)結(jié)構(gòu)的描述通常包括以下內(nèi)容:

數(shù)據(jù)結(jié)構(gòu)描述={數(shù)據(jù)結(jié)構(gòu)名,含義說(shuō)明,組成:{數(shù)據(jù)

項(xiàng)或數(shù)據(jù)結(jié)構(gòu)}}

3.?dāng)?shù)據(jù)流

數(shù)據(jù)流是數(shù)據(jù)結(jié)構(gòu)在系統(tǒng)內(nèi)傳輸?shù)穆窂?。?duì)數(shù)據(jù)流的描述通常包括以下內(nèi)容:

數(shù)據(jù)流描述={數(shù)據(jù)流名,說(shuō)明,數(shù)據(jù)流來(lái)源,數(shù)據(jù)流

去向,組成:{數(shù)據(jù)結(jié)構(gòu)},平均流量,

高峰期流量}

其中,數(shù)據(jù)流來(lái)源說(shuō)明該數(shù)據(jù)流來(lái)自哪個(gè)過(guò)程,數(shù)據(jù)流去向說(shuō)明該數(shù)據(jù)流將要到哪個(gè)過(guò)程去,平均流量指單位時(shí)間里的傳輸次數(shù),高峰期流量指在高峰時(shí)期的數(shù)據(jù)流量。

4.?dāng)?shù)據(jù)存儲(chǔ)

數(shù)據(jù)存儲(chǔ)是指數(shù)據(jù)結(jié)構(gòu)停留或保存的地方,也是數(shù)據(jù)流的來(lái)源和去向之一。對(duì)數(shù)據(jù)存儲(chǔ)的描述通常包括以下內(nèi)容:

數(shù)據(jù)存儲(chǔ)描述={數(shù)據(jù)存儲(chǔ)名,說(shuō)明,編號(hào),流入的數(shù)

據(jù)流,流出的數(shù)據(jù)流,組成:{數(shù)據(jù)結(jié)

構(gòu)},數(shù)據(jù)量,存取方式}

其中,數(shù)據(jù)量是指每次存取多少數(shù)據(jù),每天存取幾次信息;存取方式包括是批處理還是聯(lián)機(jī)處理,是檢索還是更新,是順序檢索還是隨機(jī)檢索等。另外,流入的數(shù)據(jù)流要指出其來(lái)源,流出的數(shù)據(jù)流要指出其去向。

5.處理過(guò)程

數(shù)據(jù)字典中只需要描述處理過(guò)程的說(shuō)明性信息,通常包括以下內(nèi)容:

處理過(guò)程描述={處理過(guò)程名,說(shuō)明,輸入:{數(shù)據(jù)流},

輸出:{數(shù)據(jù)流},處理:{簡(jiǎn)要說(shuō)明}}

其中,簡(jiǎn)要說(shuō)明中主要說(shuō)明該處理過(guò)程的功能及處理要求。功能是指該處理過(guò)程中用來(lái)做什么;處理要求包括處理頻度要求,如單位時(shí)間里處理多少事務(wù)、多少數(shù)據(jù)量及響應(yīng)時(shí)間等。這些處理要求是后面物理設(shè)計(jì)的輸入及性能評(píng)價(jià)的標(biāo)準(zhǔn)。下面以學(xué)生管理系統(tǒng)為例,簡(jiǎn)要說(shuō)明如何定義數(shù)據(jù)字典。

(1)該子系統(tǒng)涉及很多數(shù)據(jù)項(xiàng),其中“學(xué)號(hào)”數(shù)據(jù)項(xiàng)可以如下描述:

數(shù)據(jù)項(xiàng):學(xué)號(hào)

含義說(shuō)明:唯一標(biāo)識(shí)每個(gè)學(xué)生

別名:學(xué)生編號(hào)

類(lèi)型:字符型

長(zhǎng)度:8

取值范圍:00000000~99999999

取值含義:年(2位)+年制(1位)+專(zhuān)業(yè)號(hào)(2位,系+專(zhuān)業(yè))+班號(hào)(1位)+學(xué)號(hào)(2位),如07303101。

(2)“學(xué)生”是學(xué)生管理子系統(tǒng)中的一個(gè)核心數(shù)據(jù)結(jié)構(gòu),它可以如下描述:

數(shù)據(jù)結(jié)構(gòu):學(xué)生

含義說(shuō)明:是學(xué)生管理子系統(tǒng)的主體數(shù)據(jù)結(jié)構(gòu),定義

了一個(gè)學(xué)生的有關(guān)信息。

組成:學(xué)號(hào)、姓名、性別

(3)數(shù)據(jù)流“考試/考查”可以如下描述:

數(shù)據(jù)流:平時(shí)成績(jī),期中成績(jī),期末成績(jī)

說(shuō)明:測(cè)試學(xué)生學(xué)習(xí)程度和測(cè)量教師教學(xué)水平

數(shù)據(jù)流來(lái)源:考試/考查的卷面分?jǐn)?shù)

數(shù)據(jù)流去向:課程最后評(píng)定分?jǐn)?shù)

(4)數(shù)據(jù)存儲(chǔ)“學(xué)生信息表”可以如下描述:

數(shù)據(jù)存儲(chǔ):學(xué)生信息表

說(shuō)明:記錄學(xué)生的基本情況

流入數(shù)據(jù)流:學(xué)號(hào)、姓名、性別

流出數(shù)據(jù)流:人數(shù)

存取方式:隨機(jī)存取

數(shù)據(jù)量:記錄字節(jié)數(shù)×年級(jí)×標(biāo)準(zhǔn)班人數(shù)×班級(jí)數(shù)

(5)處理過(guò)程“修改學(xué)生基本信息”可以如下描述:

處理過(guò)程名稱(chēng):修改學(xué)生基本信息

輸入:數(shù)據(jù)流學(xué)生信息表(學(xué)號(hào)、姓名、性別)、學(xué)生

變動(dòng)名單(學(xué)號(hào)),來(lái)自學(xué)生人員管理辦公室

輸出:數(shù)據(jù)流變動(dòng)后的學(xué)生信息表,去向?qū)W生庫(kù)

描述:將有變動(dòng)的學(xué)生情況進(jìn)行修改錄入,以備后用

處理:學(xué)生退學(xué)或新入學(xué)發(fā)生

5.4創(chuàng)?建?數(shù)?據(jù)?表

SQLServer數(shù)據(jù)庫(kù)通常包含多個(gè)表,表是一個(gè)存儲(chǔ)數(shù)據(jù)的實(shí)體,具有唯一的名稱(chēng)??梢哉f(shuō)數(shù)據(jù)庫(kù)實(shí)際上是表的集合,具體的數(shù)據(jù)都是存儲(chǔ)在表中的。表是對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)和操作的一種邏輯結(jié)構(gòu),每一個(gè)表代表一個(gè)對(duì)象。

SQLServer中每個(gè)數(shù)據(jù)庫(kù)最多可存儲(chǔ)20億個(gè)數(shù)據(jù)表,每個(gè)表可以有1024列,每行最多可以存儲(chǔ)8060字節(jié)。SQLServer中有兩種表:永久表和臨時(shí)表。永久表在創(chuàng)建后一直存儲(chǔ)在數(shù)據(jù)庫(kù)文件中,除非用戶(hù)刪除該表;臨時(shí)表在系統(tǒng)運(yùn)行過(guò)程中由系統(tǒng)創(chuàng)建,一旦用戶(hù)退出或系統(tǒng)修復(fù)時(shí),臨時(shí)表將被自動(dòng)刪除。創(chuàng)建表的實(shí)質(zhì)就是定義表的結(jié)構(gòu)以及約束等。在SQLServer中,創(chuàng)建表主要有兩種方法,分別是使用SSMS和使用T-SQL語(yǔ)句創(chuàng)建表。5.4.1使用SSMS創(chuàng)建表

使用SSMS在StudentScoreManager數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)用于存儲(chǔ)學(xué)生基本信息的數(shù)據(jù)表,其表名為學(xué)生基本信息StudentInformation,表結(jié)構(gòu)如表5-5所示。使用SSMS創(chuàng)建表的操作步驟如下:

(1)啟動(dòng)SSMS,在對(duì)象資源管理器中展開(kāi)已經(jīng)建立的StudentInformation數(shù)據(jù)庫(kù),并右擊【表】項(xiàng),選擇【新建表】命令,如圖5-7所示。圖5-7新建表

(2)彈出的編輯窗口,即為表設(shè)計(jì)器對(duì)話框。在該對(duì)話框中,用戶(hù)可以將自己所設(shè)計(jì)的表結(jié)構(gòu)輸入到【列名】文本框中,并設(shè)置該列的【數(shù)據(jù)類(lèi)型】(包含數(shù)據(jù)長(zhǎng)度)以及【允許空】等信息,如圖5-8所示。圖5-8定義表結(jié)構(gòu)屬性在該對(duì)話框中,需要對(duì)表的內(nèi)容進(jìn)行定義,其內(nèi)容如下:

①輸入列名,列名在表中必須唯一,列的命名必須遵守SQLServer的數(shù)據(jù)庫(kù)對(duì)象的命名規(guī)則;

②選擇正確的數(shù)據(jù)類(lèi)型、數(shù)據(jù)長(zhǎng)度和精度;

③規(guī)定該列的數(shù)據(jù)是否為空;

④設(shè)置表格的主鍵和索引。

(3)輸入完各列屬性后,單擊工具欄上的【保存】按鈕,在彈出的如圖5-9所示的【選擇名稱(chēng)】對(duì)話框的【輸入表名】文本框里輸入表名稱(chēng)“StudentInformation”,單擊【確定】按鈕將其保存。圖5-9選擇名稱(chēng)對(duì)話框下面對(duì)創(chuàng)建表時(shí)經(jīng)常設(shè)置的屬性加以說(shuō)明。

1)列名,數(shù)據(jù)類(lèi)型,長(zhǎng)度

列名:指定字段名稱(chēng),每個(gè)表至多可定義1024個(gè)字段。字段名要遵守標(biāo)識(shí)符的規(guī)定,在特定表中必須是唯一的,但同一數(shù)據(jù)庫(kù)中的不同表可使用相同的列名。

數(shù)據(jù)類(lèi)型:指定該字段的數(shù)據(jù)類(lèi)型。用戶(hù)可以自己輸入,也可以從下拉列表中選擇,但是輸入的數(shù)據(jù)類(lèi)型必須與下拉列表中所列數(shù)據(jù)類(lèi)型相匹配。如果定義了用戶(hù)自定義數(shù)據(jù)類(lèi)型,該類(lèi)型也會(huì)自動(dòng)出現(xiàn)在這個(gè)下拉列表中。

長(zhǎng)度:指定字段的長(zhǎng)度,也就是字段所占字節(jié)數(shù)。

2)是否為空值

數(shù)據(jù)庫(kù)的列是否允許為空值也是一項(xiàng)約束。如果該列允許為空值,則在輸入該數(shù)據(jù)行時(shí),這一項(xiàng)可以不輸入。

列是否允許為空與具體的要求相關(guān)。例如一些學(xué)生有電話號(hào)碼,而另一些學(xué)生沒(méi)有電話號(hào)碼,這一項(xiàng)就應(yīng)該允許為空;而重要的、不可缺少的信息,如姓名,就不允許為空。

3)標(biāo)識(shí)列

在很多情況下,存儲(chǔ)的信息中很難找到不重復(fù)的信息作為列的主鍵。就拿學(xué)生信息來(lái)說(shuō),以姓名作為主鍵,一個(gè)班就不允許有同名的學(xué)生。如果一張表存儲(chǔ)整個(gè)學(xué)校的學(xué)生信息,那么整個(gè)學(xué)校的學(xué)生都不允許重名,這顯然是不現(xiàn)實(shí)的。

SQLServer提供一個(gè)“標(biāo)識(shí)列”,特意對(duì)列來(lái)區(qū)分。標(biāo)識(shí)列本身沒(méi)有具體的意義,只是用來(lái)區(qū)分不同的行的。標(biāo)識(shí)列的實(shí)現(xiàn)方式如下:

(1)如果一列的數(shù)據(jù)類(lèi)型是整型,則可以把該列定義為標(biāo)識(shí)列;

(2)定義為標(biāo)識(shí)列之后,還需要分別指定“標(biāo)識(shí)種子”和“標(biāo)識(shí)遞增量”,默認(rèn)值都是1;

(3)定義了標(biāo)識(shí)列之后,在以后每次輸入數(shù)據(jù)時(shí),該列隨數(shù)據(jù)行的增加而自動(dòng)增加數(shù)字,并且不會(huì)重復(fù),第一次的數(shù)字就是“標(biāo)識(shí)種子”值,以后每次按“標(biāo)識(shí)遞增量”增加數(shù)值。

標(biāo)識(shí)列通常也被定義為主鍵。通常所說(shuō)的“自動(dòng)編號(hào)”就是指標(biāo)識(shí)列的數(shù)值自動(dòng)增加。

如圖5-10所示,設(shè)置SId列為“標(biāo)識(shí)列”,設(shè)置“標(biāo)識(shí)規(guī)范”為“是”,初始值為1,每次遞增值為1。圖5-10設(shè)置標(biāo)識(shí)列

4)默認(rèn)值

當(dāng)向數(shù)據(jù)表中輸入數(shù)值時(shí),通常會(huì)希望表里面的某些列已經(jīng)具有一些默認(rèn)值,不必讓用戶(hù)一一輸入;或者是用戶(hù)現(xiàn)在還不準(zhǔn)備輸入但又不想空著。例如,輸入學(xué)生性別的時(shí)候,先默認(rèn)所有學(xué)生的性別為“男”,如果輸入的是個(gè)男生,則“性別”列就不必重復(fù)輸入了;如果是女生,就將“男”改為“女”,這樣大量減少輸入數(shù)據(jù)的工作量。又如輸入一個(gè)班級(jí)的課程信息,由于全班學(xué)生在一個(gè)教室上課,那么設(shè)定教室一個(gè)默認(rèn)值,則每個(gè)同學(xué)的上課教室就不必輸入了。

5)說(shuō)明

顯示描述此列的文本。若要編輯該說(shuō)明,則選擇相應(yīng)屬性,單擊屬性值右側(cè)顯示的省略號(hào)(…),然后在“說(shuō)明屬性”對(duì)話框中編輯說(shuō)明。如將SNo字段的說(shuō)明設(shè)為“學(xué)生學(xué)號(hào)”。5.4.2使用T-SQL語(yǔ)句創(chuàng)建表

可以用Transact-SQL語(yǔ)句創(chuàng)建表,其語(yǔ)法格式如下:

CREATETABLE[database_name.[owner].|owner.]table_name

({<column_definition>|column_nameAScomputed_column_expression}[,...n])

[ON{filegroup|DEFAULT}]

[TEXTIMAGE_ON{filegroup|DEFAULT}]

<column_definition>::={column_namedata_type}

[[DEFAULTconstant_expression]

|[IDENTITY[(seed,increment)[NOTFORREPLICATION]]]][...n]各參數(shù)說(shuō)明如下:

database_name:指定新建的表屬于哪個(gè)數(shù)據(jù)庫(kù)。如果不指定數(shù)據(jù)庫(kù)名,則會(huì)將所創(chuàng)建的表存放在當(dāng)前數(shù)據(jù)庫(kù)中。

owner:指定數(shù)據(jù)庫(kù)所有者的用戶(hù)名。

table_name:指定新建表的名稱(chēng),最長(zhǎng)不超過(guò)128個(gè)字符。對(duì)數(shù)據(jù)庫(kù)來(lái)說(shuō),database_name.owner_name.object_name應(yīng)該是唯一的。

column_name:指定表中的列名稱(chēng),列名必須符合標(biāo)識(shí)符規(guī)則,并且在表內(nèi)唯一。

computed_column_expression:指定計(jì)算列(Computedcolumn)列值的表達(dá)式。表達(dá)式可以是列名、常量、變量、函數(shù)等或它們的組合。所謂計(jì)算列,是一個(gè)虛擬的列,它的值并不實(shí)際存儲(chǔ)在表中,而是通過(guò)對(duì)同一個(gè)表中其他列進(jìn)行某種計(jì)算而得到的結(jié)果。例如:平均成績(jī)=總分/n。

ON{filegroup|DEFAULT}:指定存儲(chǔ)表的文件組名。如果使用了DEFAULT選項(xiàng)或省略了ON子句,則新建的表會(huì)存儲(chǔ)在默認(rèn)文件組中。

TEXTIMAGE_ON:指定text、ntext和image列的數(shù)據(jù)存儲(chǔ)的文件組。如果無(wú)此子句,則這些類(lèi)型的數(shù)據(jù)就和表一起存儲(chǔ)在相同的文件組中。

data_type:指定列的數(shù)據(jù)類(lèi)型。

DEFAULT:指定列的缺省值。當(dāng)輸入數(shù)據(jù)時(shí),如果用戶(hù)沒(méi)有指定列值,則系統(tǒng)就會(huì)用設(shè)定的缺省值作為列值;如果該列沒(méi)有指定缺省值但允許NULL值,則NULL值就會(huì)作為缺省值。其中缺省值可以為常數(shù)、NULL值、SQLServer內(nèi)部函數(shù)(如GETDATE()函數(shù))、NILADIC函數(shù)等。

constant_expression:列缺省值的常量表達(dá)式,可以為一個(gè)常量或系統(tǒng)函數(shù)或NULL。

IDENTITY:指定列為identity列。一個(gè)表中只能有一個(gè)identity列。

seed:指定identity列的初始值。

increment:指定identity列的增量。

NOTFORREPLICATION:指定列的identity屬性在把從其他表中復(fù)制的數(shù)據(jù)插入到表中時(shí)不發(fā)生作用,即不足的生成列值,使得復(fù)制的數(shù)據(jù)行保持原來(lái)的列值。

看了上面的Transact-SQL語(yǔ)法,很容易讓人摸不著頭腦,云里霧里。先來(lái)看看下面的例子,再回過(guò)頭來(lái)看看上面的語(yǔ)法,就會(huì)理清頭緒。以后也可以創(chuàng)建復(fù)雜的數(shù)據(jù)表。例5-2

利用CREATETABLE命令創(chuàng)建學(xué)生基本信息表StudentInformation。

USESTUDENTSCOREMANAGER

GO

CREATETABLESTUDENTINFORMATION

(

SNO

CHAR(8)

NOTNULL,

SNAMEVARCHAR(10)NOTNULL,

SSEX

CHAR(2),

PRIMARYKEY(SNO)

)

GO其中,PRIMARYKEY為主鍵標(biāo)識(shí),表示SNO為主鍵。

例5-3

創(chuàng)建學(xué)生成績(jī)表StudentScore。

CREATETABLEStudentScore

(

SSIDINTIDENTITY(1,1)NOTNULL,

SSNOCHAR(8)NULL,

SSCIDCHAR(9)NULL,

SSScoreTINYINTNULL,

)

GO

其中,列屬性IDENTITY(起始值,遞增量)表示SSID列為自動(dòng)編號(hào)。

5.5查看數(shù)據(jù)表信息

5.5.1查看表結(jié)構(gòu)

在數(shù)據(jù)庫(kù)中創(chuàng)建完數(shù)據(jù)表后,就可以通過(guò)SSMS或T-SQL語(yǔ)句來(lái)查看數(shù)據(jù)表的相關(guān)信息了。

1.使用SSMS查看表結(jié)構(gòu)

在SSMS中,右擊需要查看結(jié)構(gòu)的表,在彈出的快捷菜單中選擇“屬性”命令,就可以打開(kāi)表屬性對(duì)話框,單擊“常規(guī)”標(biāo)簽頁(yè)即可查看表信息,如圖5-11所示。圖5-11使用SSMS查看表結(jié)構(gòu)

2.使用T-SQL語(yǔ)句查看表結(jié)構(gòu)

除了可以用SSMS查看表結(jié)構(gòu)外,還可以執(zhí)行系統(tǒng)存儲(chǔ)過(guò)程sp_help來(lái)查看表結(jié)構(gòu),其語(yǔ)法格式為

[EXECUTE|EXEC]sp_help[表名]

GO

例5-4

查看數(shù)據(jù)庫(kù)StudentScoreManager中StudentScore表的表結(jié)構(gòu)。

操作步驟:

(1)在SSMS代碼編輯窗口中輸入命令,如圖5-12所示。圖5-12使用T-SQL語(yǔ)句查看表結(jié)構(gòu)

(2)單擊工具欄中的按鈕或按下F5鍵運(yùn)行,運(yùn)行結(jié)果如圖5-13所示。圖5-13查看表結(jié)構(gòu)運(yùn)行結(jié)果5.5.2查看表中的數(shù)據(jù)

1)使用SSMS查看表中的數(shù)據(jù)

在SSMS中,右擊要查看數(shù)據(jù)的表,彈出快捷菜單,單擊“打開(kāi)表”命令,打開(kāi)查詢(xún)窗口,即可看到表中的數(shù)據(jù)。

2)使用T-SQL語(yǔ)句查看表中的數(shù)據(jù)

單擊工具欄中“新建查詢(xún)”,打開(kāi)SSMS代碼編輯窗口,在其中輸入下列語(yǔ)句:

usestudentscoremanager

--打開(kāi)數(shù)據(jù)庫(kù)

go

select*fromstudentinformation--對(duì)指定的數(shù)據(jù)表進(jìn)行數(shù)據(jù)查詢(xún)

go

在結(jié)果窗口中便可查看到表中的數(shù)據(jù),如圖5-14所示。數(shù)據(jù)表的操作中一項(xiàng)重要內(nèi)容就是對(duì)表中的數(shù)據(jù)內(nèi)容進(jìn)行查詢(xún)。查詢(xún)主要是根據(jù)用戶(hù)提供的限定條件進(jìn)行,查詢(xún)的結(jié)果將返回一張滿(mǎn)足用戶(hù)要求的表。SQLServer中用SELECT語(yǔ)句對(duì)數(shù)據(jù)表中的數(shù)據(jù)進(jìn)行查詢(xún)。關(guān)于SELECT語(yǔ)句將在后面進(jìn)行詳細(xì)介紹。圖5-14使用T-SQL語(yǔ)句查看表中的數(shù)據(jù)

5.6修改數(shù)據(jù)表及設(shè)置完整性約束

5.6.1修改表的結(jié)構(gòu)

用戶(hù)在創(chuàng)建好表后,可能在使用一段時(shí)間后,需要對(duì)所創(chuàng)建表的結(jié)構(gòu)、約束或其他列的屬性進(jìn)行修改,以符合目前使用的實(shí)際狀況。

在SQLServer2005中,修改表與創(chuàng)建表同樣簡(jiǎn)單。一般可以使用SSMS和T-SQL語(yǔ)言?xún)煞N方法來(lái)修改表。對(duì)一個(gè)已存在的表可以進(jìn)行的修改操作包括:更改表名、增加列、刪除列、修改已有列的屬性(列名、數(shù)據(jù)類(lèi)型、是否為空值)。

1.使用SSMS修改表

1)更改表名

SQLServer中允許改變一個(gè)表的名字,但當(dāng)表名改變后,與此相關(guān)的某些對(duì)象以及通過(guò)表名與表相關(guān)的存儲(chǔ)過(guò)程將無(wú)效。因此,一般不要更改一個(gè)已有的表名,特別是該表已定義了視圖或建立了表關(guān)系。下面將前面所創(chuàng)建的“StudentInformation”的表名改為“Stud_info”。

在SQLServerSSMS中,展開(kāi)所要更改表名的數(shù)據(jù)庫(kù),右擊所要修改的表,選擇【重命名】命令,例如重命名“StudentInformation”表,如圖5-15所示。圖5-15選擇【重命名】命令此時(shí),“StudentInformation”變成可更改狀態(tài),用戶(hù)可以輸入新的表名。例如,輸入“Stud_info”,如圖5-16所示,然后按回車(chē)鍵。

注意:在操作完畢后,為方便進(jìn)行下面的操作,應(yīng)將所操作的表的表名改回“StudentInformation”。圖5-16輸入新的表名

2)增加列

在日常工作中,經(jīng)常需要添加或者刪除某一項(xiàng)目,這樣就需要為當(dāng)前所使用的表增加列。此處以向“StudentInformation”中添加一個(gè)“備注”列為例,來(lái)說(shuō)明在SSMS中向表中添加新列的操作過(guò)程?!皞渥ⅰ绷袨閠ext字符型,允許為空。

在SSMS中展開(kāi)需進(jìn)行操作的“StudentInformation”,右擊“StudentInformation”,選擇【修改】命令,如圖5-17所示。圖5-17選擇【修改】命令在彈出的【表設(shè)計(jì)器】對(duì)話框中,單擊第一個(gè)空白行,輸入新添加的列名“SMemo”,并選擇數(shù)據(jù)類(lèi)型為text,該列允許空,如圖5-18所示。當(dāng)要向表中添加的列均輸入完畢后,單擊工具欄上的【保存】按鈕對(duì)表進(jìn)行保存。圖5-18增加新列

3)刪除列

在SQLServer中,被刪除的列是不可恢復(fù)的,所以在刪除列之前需要慎重考慮。并且,在刪除一個(gè)列之前,必須保證基于該列的所有索引和約束都已被刪除。

例如,我們將所創(chuàng)建的“備注”列刪除,其具體操作步驟如下:

在SSMS中展開(kāi)需要?jiǎng)h除列的表,右擊該表,選擇【修改】命令,例如要?jiǎng)h除“StudentInformation”中的列。

在【表設(shè)計(jì)器】對(duì)話框中,右擊要?jiǎng)h除的列,選擇【刪除列】命令,例如刪除“StudentInformation”中名為“SMemo”的列,如圖5-19所示,該列即被刪除。單擊工具欄上的【保存】按鈕,對(duì)修改的表進(jìn)行保存。圖5-19選擇【刪除列】命令

4)修改已有列的屬性

在表中尚未有記錄時(shí),可以修改表結(jié)構(gòu),如更改列名、列的數(shù)據(jù)類(lèi)型、列的長(zhǎng)度和是否允許空值等屬性。但當(dāng)表中有了記錄時(shí),建議不要輕易改變表結(jié)構(gòu),特別不要改變數(shù)據(jù)類(lèi)型,以免產(chǎn)生錯(cuò)誤而造成數(shù)據(jù)丟失。

用戶(hù)不能對(duì)以下特性的列進(jìn)行修改:

①具有text、ntext、image或timestamp數(shù)據(jù)類(lèi)型的列;

②計(jì)算列;

③全局標(biāo)識(shí)符列;

④被復(fù)制列;⑤用于索引的列(但若用于索引的列為varchar、nvarchar或varbinary數(shù)據(jù)類(lèi)型時(shí),可以增加列的長(zhǎng)度);

⑥用于由CREATESTATISTICS生成統(tǒng)計(jì)的列,若需修改這樣的列,必須先用DROPSTATISTICS語(yǔ)句刪除統(tǒng)計(jì);

⑦用于主鍵或外鍵約束的列;

⑧用于check或unique約束的列;

⑨關(guān)聯(lián)有默認(rèn)值的列。改變列的數(shù)據(jù)類(lèi)型時(shí),有下列要求:

①原數(shù)據(jù)類(lèi)型必須能夠轉(zhuǎn)換為新數(shù)據(jù)類(lèi)型;

②新類(lèi)型不能為timestamp類(lèi)型;

③如果被修改的是identity列,則新數(shù)據(jù)類(lèi)型必須是有效的identity數(shù)據(jù)類(lèi)型。

在【表設(shè)計(jì)器】對(duì)話框中,直接修改列的名稱(chēng)、類(lèi)型等屬性。單擊工具欄上的【保存】按鈕,對(duì)修改的表進(jìn)行保存。

2.使用ALTERTABLE語(yǔ)句修改表

前面我們學(xué)習(xí)了使用SSMS來(lái)修改表,下面使用T-SQL中的ALTERTABLE語(yǔ)句來(lái)修改表。

ALTERTABLE語(yǔ)句的語(yǔ)法格式如下所示:

ALTERTABLEtable_name

{[ALTERCOLUMNcolumn_name/*修改已有列的屬性*/

{new_data_type[(precision[,scale])]

[NULL?|?NOTNULL]]}

|?ADD{[<column_definition>]}[,…n]/*增加新列*/

|?DROP{[CONSTRATINT]constraint_name?|?COLUMN}[,…n]

/*刪除列*/主要參數(shù)與子句的含義:

table_name:用來(lái)指定要修改的表的名稱(chēng)。

ALTERCOLUMN子句:用來(lái)指定要進(jìn)行修改的表中的字段的屬性,要修改的字段名由column_name給出。

new_data_type:用來(lái)指定被修改字段的新數(shù)據(jù)類(lèi)型。

precision:用來(lái)指定新數(shù)據(jù)類(lèi)型的有效位數(shù)。

scale:用來(lái)指定新數(shù)據(jù)類(lèi)型的小數(shù)位數(shù)。

NULL?|?NOTNULL:用來(lái)指定其字段是否可接受NULL。

ADD子句:用來(lái)向表中增加新字段。新字段的定義方法與CREATETABLE語(yǔ)句中定義字段的方法相同。

DROP子句:用來(lái)從表中刪除字段或約束。COLUMN參數(shù)中指定的是被刪除的字段名,constraint_name是被刪除的約束名。

例5-5

在表StudentInformation中增加一個(gè)新列“SMemo”。

新增列的命令如圖5-20所示。圖5-20新增列的T-SQL命令例5-6

在表StudentInformation中刪除一個(gè)列“SMemo”。

刪除列的命令如圖5-21所示。

例5-7

將表TeacherInformation中“TName”(教師姓名)列的長(zhǎng)度由原來(lái)的50改為10,“TDepartment”列的數(shù)據(jù)類(lèi)型由原來(lái)的char改為varchar(12)。

修改列的命令如圖5-22所示。圖5-21刪除列的T-SQL命令圖5-22修改列的T-SQL命令5.6.2定義約束

1.約束的類(lèi)型

通常創(chuàng)建表的步驟如下:首先,定義表結(jié)構(gòu),給表的每一列取列名,并確定每一列的數(shù)據(jù)類(lèi)型、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)是否為空等;然后,為了限制某列輸入值的取值范圍,為保證輸入值的正確性和一致性而設(shè)置約束;當(dāng)表結(jié)構(gòu)和約束建立完成之后,就可以向表中輸入數(shù)據(jù)了。本節(jié)將介紹創(chuàng)建表過(guò)程中如何設(shè)置約束。SQLServer中有五種約束類(lèi)型,分別是CHECK約束、DEFAULT約束、PRIMARYKEY約束、FOREINGKEY約束和UNIQUE約束。檢查約束(checkconstraint):某列取值范圍限制、格式限制等,如有關(guān)年齡的約束。

默認(rèn)約束(defaultconstraint):某列的默認(rèn)值,如我們的男性學(xué)員較多,則性別默認(rèn)為“男”。

主鍵約束(primarykeyconstraint):要求主鍵列數(shù)據(jù)一致,不允許為空。

外鍵約束(foreignconstraint):用于兩表之間建立關(guān)系,需要指定引用主表的哪一列。

唯一約束(uniqueconstraint):要求該列唯一,允許為空,但只能出現(xiàn)一個(gè)空值。

2.在SSMS建立CHECK約束

CHECK約束實(shí)際上是字段輸入內(nèi)容的驗(yàn)證規(guī)則,表示一個(gè)字段的輸入內(nèi)容必須滿(mǎn)足CHECK約束的條件,若不滿(mǎn)足,則數(shù)據(jù)無(wú)法輸入。

CHECK約束可以作為表定義的一部分在創(chuàng)建表時(shí)創(chuàng)建,也可以添加到現(xiàn)有的表中。表和列可以包含多個(gè)CHECK約束。允許修改或刪除現(xiàn)有的CHECK約束。

在表StudentScore中,學(xué)生每門(mén)課程的成績(jī)一般在0~100的范圍內(nèi),如果對(duì)用戶(hù)的輸入數(shù)據(jù)要施加這一限制,則可以按照下列步驟進(jìn)行操作。

(1)啟動(dòng)SSMS,打開(kāi)StudentScore表設(shè)計(jì)器窗口,單擊鼠標(biāo)右鍵,彈出如圖5-23所示的快捷菜單。

(2)選擇【CHECK約束】命令,進(jìn)入如圖5-24所示的對(duì)話框。切換到【CHECK約束】對(duì)話框。

(3)單擊【添加】按鈕,彈出如圖5-25所示的對(duì)話框。在【選定的CHECK約束】列表框中顯示系統(tǒng)分配的新約束名,名稱(chēng)以“CK_”開(kāi)始,后跟表名,可以修改此約束名。在約束表達(dá)式文本框中,輸入約束表達(dá)式“SSScore>=0andSSScore<=100”,如圖5-26所示,單擊【關(guān)閉】按鈕。圖5-23添加CHECK約束圖5-24【CHECK約束】對(duì)話框圖5-25添加CHECK約束

圖5-26輸入CHECK約束條件按照上述步驟創(chuàng)建約束后,輸入數(shù)據(jù)時(shí)如果成績(jī)不在0~100的范圍內(nèi),系統(tǒng)將報(bào)告錯(cuò)誤。

如果要?jiǎng)h除上述約束,只需進(jìn)入如圖5-25所示的【CHECK約束】對(duì)話框,在【選定的CHECK約束】列表框中選擇要?jiǎng)h除的約束,然后單擊【刪除】按鈕即可。

3.在SSMS中建立主鍵約束

PRIMARYKEY約束可以在表中定義一個(gè)主鍵,來(lái)唯一地標(biāo)識(shí)表中的行。主鍵可以是一列或列組合,PRIMARYKEY約束中的列不能取空值和重復(fù)值。如果PRIMARYKEY約束有多列組合定義,則某一列的值可以重復(fù),但PRIMARYKEY約束中所有列的組合值必須唯一。一個(gè)表只能有一個(gè)PRIMARYKEY約束,而且每個(gè)表都應(yīng)該有一個(gè)主鍵。

在創(chuàng)建表時(shí),確定了列的名稱(chēng)、數(shù)據(jù)類(lèi)型和允許為空之后,表的基本框架就完成了,但是通常還應(yīng)該設(shè)置主鍵約束來(lái)確保表的行是唯一的。建立主鍵約束的方法較簡(jiǎn)單,首先選擇要建立主鍵的列,單擊右鍵,然后在彈出的快捷菜單中選擇“設(shè)置主鍵”選項(xiàng)即可,如對(duì)StudentInformation表的SNo字段設(shè)置主鍵如圖5-27所示。圖5-27確定表的主鍵設(shè)置該列為主鍵以后,該列上多了個(gè)鑰匙形的圖案用于標(biāo)識(shí)。如果主鍵由多個(gè)字段組成,則可以先選中這些字段,然后再設(shè)置主鍵圖標(biāo)。選擇多字段的方法是按住【Ctrl】鍵再單擊相應(yīng)的字段;如果字段是連續(xù)的,也可先在第一個(gè)字段上單擊,然后按住【Shift】鍵,單擊最后一個(gè)字段。

另外,image、text數(shù)據(jù)類(lèi)型的字段不能設(shè)置為主鍵。

4.默認(rèn)值

有時(shí)候,對(duì)某項(xiàng)數(shù)據(jù)進(jìn)行輸入時(shí),它總存在一個(gè)默認(rèn)值。例如,教師的級(jí)別如果不輸入,默認(rèn)值可以為“講師”。表的默認(rèn)值設(shè)置能夠定義一個(gè)值,每當(dāng)用戶(hù)沒(méi)有在某一列中輸入數(shù)值時(shí),則將所定義的值提供給這一列。

如圖5-28所示,stud_info表中學(xué)生的地址列可以在表的下方定義默認(rèn)值為“某學(xué)院”,這一列在不輸入的情況下,都統(tǒng)一是該地址。圖5-28設(shè)置列的默認(rèn)值

5.在SSMS中建立外鍵約束

外鍵(foreignkey)是用于建立和加強(qiáng)兩個(gè)表(主表與外表)的一列或多列數(shù)據(jù)之間的連接。當(dāng)數(shù)據(jù)添加、修改或刪除時(shí),通過(guò)參照完整性保證它們之間數(shù)據(jù)的一致性。定義表之間的參照完整性是先定義主表的主鍵,再通過(guò)從表定義外鍵約束。根據(jù)它的概念,StudentScoreManager數(shù)據(jù)庫(kù)中的學(xué)生成績(jī)表(StudentScore)中記錄每名學(xué)生的每門(mén)課程的成績(jī),它里面包含有課程號(hào)(SSCID);另一張表課程信息表(CourseInformation)記錄的是每門(mén)課程的名稱(chēng)、開(kāi)課學(xué)期、開(kāi)課年級(jí)等信息,它里面也包含有課程號(hào)(CID)。如果要查詢(xún)某學(xué)生某門(mén)課程的成績(jī),必須將兩張表聯(lián)合起來(lái)查詢(xún),那么就需要將兩張表連接起來(lái)。設(shè)置外鍵就是實(shí)現(xiàn)兩張表的連接。對(duì)于表CourseInformation設(shè)置CID列為其主鍵,對(duì)于表CourseInformation設(shè)置SSCID列為其外鍵,這樣通過(guò)CID列建立起兩個(gè)表之間的外鍵約束關(guān)系。下面通過(guò)SSMS來(lái)創(chuàng)建學(xué)生成績(jī)表(StudentScore)與課程信息表(CourseInformation)之間的外鍵約束關(guān)系。

首先,檢查在課程信息表(CourseInformation)中是否將CID列設(shè)置為主鍵,如果沒(méi)有就先設(shè)置它為該表的主鍵。接著,打開(kāi)學(xué)生成績(jī)表StudentScore的設(shè)計(jì)表窗口,選中SSCID所在的列,單擊右鍵,在彈出的快捷菜單中選擇【關(guān)系】命令,如圖5-29所示。此時(shí)彈出【外鍵關(guān)系】對(duì)話框,單擊【添加】按鈕,如圖5-30所示。在【表和列規(guī)范】中設(shè)置關(guān)系,如圖5-31所示。在如圖5-32所示的主鍵表下拉選擇框中選定CourseInformation表,并單擊主鍵表下的下拉按鈕,選擇其中的CID;在外鍵表系列選擇框中選定StudentScore表;并單擊外鍵表下的下拉按鈕,選擇其中的SSCID。如果想重命名外鍵約束名,則可以在關(guān)系名文本框中重新輸入新的名稱(chēng)。最后,單擊【關(guān)閉】按鈕,即完成外鍵約束的創(chuàng)建。這樣,兩張表通過(guò)CID就連接起來(lái)了,如圖5-33所示。圖5-29選擇【關(guān)系】命令圖5-30【外鍵關(guān)系】對(duì)話框圖5-31設(shè)置【表和列規(guī)范】圖5-32設(shè)置主鍵和外鍵表圖5-33設(shè)置外鍵關(guān)系

6.使用T-SQL添加約束

在創(chuàng)建表時(shí),我們可以在字段后添加各種約束,但一般不這樣混合使用,推薦將添加約束和創(chuàng)建表的語(yǔ)句分開(kāi)編寫(xiě)。

添加約束的語(yǔ)法如下:

ALTERTABLE表名

ADDCONSTRAINT約束名約束類(lèi)型具體的約束說(shuō)明

上述語(yǔ)法表示修改某個(gè)表,添加某個(gè)約束。其中,約束名的命名規(guī)則推薦采用“約束類(lèi)型_約束字段”這樣的形式。例如:

為表StudentInformation中的學(xué)號(hào)字段(SNo)添加的主鍵約束,約束名命名為PK_STUNO;為表StudentScore中的課程編號(hào)(SSCID)添加的唯一約束,約束名命名為UQ_SSCID;

為表TeacherInformation中的部門(mén)字段TDepartment添加的默認(rèn)約束,約束名命名為DF_TDp;

為表TeacherInformation性別字段TSex添加的檢查約束,約束名推薦取名為CK_TSex;

為表StudentScore中字段SSCID添加的外鍵約束,約束名推薦取名為FK_SSCID。例5-8

添加主鍵約束。

ALTERTABLEStudentInformation

ADDCONSTRAINTPK_STUNOPRAMARYKEY(SNO)

例5-9

添加唯一約束。

ALTERTABLEStudentScore

ADDCONSTRAINTUQ_SSCIDUNIQUE(SSCID)

例5-10

添加默認(rèn)約束。

ALTERTABLETeacherInformation

ADDCONSTRAINTDF_TDpDEFAULT(‘西航院’)FORTDepartment例5-11

添加約束檢查,要求性別只能填“男”或“女”。

ALTERTABLESTUINFO

ADDCONSTRAINTCK_TSexCHECK(TSex=‘男’orTSex=‘女’)

例5-12

添加外鍵約束。

ALTERTABLEStudentScore

ADDCONSTRAINTFK_SSCID

FOREIGNKEY(SSCID)REFERENCESCourseInformation(CID)

GO

7.刪除約束

如果錯(cuò)誤地添加了約束,則可以刪除約束。刪除約束的語(yǔ)法如下:

ALTERTABLE表名

DROPCONSTRAINT約束名

例如,刪除STUINFO表中的默認(rèn)約束的語(yǔ)句如下:

ALTERTABLESTUINFO

DROPCONSTRAINTDF_STUADDRESS

5.7刪?除?數(shù)?據(jù)?表

當(dāng)一個(gè)表不再使用時(shí),可以將該表刪除。刪除一個(gè)表同樣有兩種方法:一種是利用SSMS,另一種是利用T-SQL語(yǔ)句。

1.利用SSMS實(shí)現(xiàn)對(duì)表的刪除

在前面我們創(chuàng)建了“Stud_Info”表,下面我們使用SSMS來(lái)刪除該表。具體操作步驟如下:

在SSMS中,展開(kāi)所要?jiǎng)h除的表所在的數(shù)據(jù)庫(kù),并右擊所要?jiǎng)h除的表,選擇【刪除】命令,如圖5-34所示。圖5-34刪除表的T-SQL命令在彈出的【除去對(duì)象】對(duì)話框中,單擊【全部除去】按鈕即可完成對(duì)表的刪除。

2.使用DROPTABLE刪除表

下面通過(guò)T-SQL語(yǔ)句中的DROPTABLE命令來(lái)刪除表。首先,我們來(lái)了解一下DROPTABLE語(yǔ)句的語(yǔ)法格式:

DROPTABLEtable_name

在了解了DROPTABLE語(yǔ)句的語(yǔ)法后,下面以刪除“Stud_Info”表為例,學(xué)習(xí)DROPTABLE語(yǔ)句的使用方法:

DROPTABLEStud_Info

GO創(chuàng)建數(shù)據(jù)庫(kù)時(shí),如果當(dāng)前數(shù)據(jù)庫(kù)中已存在Stud_Info表,則再次創(chuàng)建時(shí)系統(tǒng)將提示出錯(cuò),刪除表也一樣,我們需要先檢測(cè)是否存在該表,如果存在,則刪除,再創(chuàng)建。某個(gè)數(shù)據(jù)庫(kù)中表的清單又存放在哪呢?答案是該數(shù)據(jù)庫(kù)中的系統(tǒng)表SYSOBJECTS。所以上述完整的創(chuàng)建表的語(yǔ)句應(yīng)如下所示:

USESTUDENTSCOREMANAGEMENT

溫馨提示

  • 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)論