版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 交通運(yùn)輸部所屬事業(yè)單位2026年度第三批統(tǒng)一公開(kāi)招聘?jìng)淇碱}庫(kù)完整答案詳解
- 2025年云南大學(xué)附屬中學(xué)星耀學(xué)校招聘?jìng)淇碱}庫(kù)參考答案詳解
- 2025年溫州銀行金華東陽(yáng)支行(籌)運(yùn)營(yíng)主管備考題庫(kù)完整參考答案詳解
- java課程設(shè)計(jì)(計(jì)算器)
- 2025江西省建工集團(tuán)有限責(zé)任公司所屬企業(yè)招聘12人考試重點(diǎn)試題及答案解析
- 2025福建莆田市公安局下半年面向社會(huì)及退役軍人招聘警務(wù)輔助人員148人備考核心題庫(kù)及答案解析
- 2025北京大學(xué)電子學(xué)院招聘1名勞動(dòng)合同制工作人員考試重點(diǎn)題庫(kù)及答案解析
- 2025四川綿陽(yáng)市安州區(qū)人民醫(yī)院第四次招聘4人筆試重點(diǎn)題庫(kù)及答案解析
- 2025年兒童托管師資五年職業(yè)發(fā)展:培訓(xùn)與考核報(bào)告
- 2025 九年級(jí)語(yǔ)文下冊(cè)文言文省略主語(yǔ)補(bǔ)充課件
- 2025年中國(guó)鐵路上海局集團(tuán)有限公司蕪湖車(chē)務(wù)段客運(yùn)服務(wù)人員招聘參考筆試題庫(kù)及答案解析
- 軍人野戰(zhàn)生存課件教學(xué)
- 婦科腫瘤的中醫(yī)藥治療
- 2025廣東廣州越秀區(qū)礦泉街招聘民政前臺(tái)工作人員1人備考題庫(kù)附答案詳解(基礎(chǔ)題)
- 關(guān)于羊肉的營(yíng)銷(xiāo)策劃方案
- 2025天津大學(xué)管理崗位集中招聘15人考試筆試參考題庫(kù)及答案解析
- 2025廣西公需科目考試題庫(kù)和答案(覆蓋99%考題)廣西一區(qū)兩地一園一通道+人工智能時(shí)代的機(jī)遇
- 杭州至寧波國(guó)家高速公路(杭紹甬高速)智慧高速機(jī)電工程質(zhì)量專(zhuān)項(xiàng)檢驗(yàn)評(píng)定標(biāo)準(zhǔn)
- 藥店食品安全管理制度目錄
- GB/T 25085.3-2020道路車(chē)輛汽車(chē)電纜第3部分:交流30 V或直流60 V單芯銅導(dǎo)體電纜的尺寸和要求
- 帆船運(yùn)動(dòng)簡(jiǎn)介課件
評(píng)論
0/150
提交評(píng)論