第2章 創(chuàng)建及維護(hù)表_第1頁(yè)
第2章 創(chuàng)建及維護(hù)表_第2頁(yè)
第2章 創(chuàng)建及維護(hù)表_第3頁(yè)
第2章 創(chuàng)建及維護(hù)表_第4頁(yè)
第2章 創(chuàng)建及維護(hù)表_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第2章創(chuàng)建及維護(hù)表

2.1【案例4】創(chuàng)建表 相關(guān)知識(shí)

1.表的設(shè)計(jì) 良好的表的設(shè)計(jì)應(yīng)該能夠精確地捕捉用戶需求,并對(duì)具體的事務(wù)處理非常了解。一個(gè)數(shù)據(jù)庫(kù)中需要包含各個(gè)方面的數(shù)據(jù),如在“選課管理”數(shù)據(jù)庫(kù)中包含學(xué)生基本信息、課程信息和選課信息等。所以在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),應(yīng)先確定需要什么樣的表,各表中都應(yīng)該包含哪些數(shù)據(jù)以及各個(gè)表之間的關(guān)系和存取權(quán)限等,這個(gè)過(guò)程稱(chēng)之為設(shè)計(jì)表。在設(shè)計(jì)表時(shí)需要確定如下項(xiàng)目:表的名稱(chēng);屬性名稱(chēng)(表中每一列的名稱(chēng));表中每一列的數(shù)據(jù)類(lèi)型和長(zhǎng)度;表中的列中是否允許空值、是否唯一、是否要進(jìn)行默認(rèn)設(shè)置或添加用戶定義約束;表中需要索引的類(lèi)型和需要建立索引的列;表間的關(guān)系,即確定哪些列是主鍵,哪些列是外鍵。 如同Excel電子表格一樣,數(shù)據(jù)在表中是按行和列的格式進(jìn)行組織的。其中每行代表一條記錄,每列代表記錄中的一個(gè)域。例如:在包含學(xué)生基本信息的“學(xué)生基本檔案”表中每一行代表一位學(xué)生的基本信息內(nèi)容,每一列表示該學(xué)生某一方面的特性,如姓名、性別、年齡、專(zhuān)業(yè)等。

2.字段數(shù)據(jù)類(lèi)型在SQLServer2005中創(chuàng)建表結(jié)構(gòu)時(shí),每一列都必須指出該列存儲(chǔ)的數(shù)據(jù)類(lèi)型,SQLServer2005可以存儲(chǔ)不同類(lèi)型的數(shù)據(jù),例如:字符、貨幣、整型和日期時(shí)間等,常用的數(shù)據(jù)類(lèi)型及其存儲(chǔ)值范圍如表2-1-1和表2-1-2所示。在MicrosoftSQLServer中,每一個(gè)列、局部變量、表達(dá)式以及參數(shù)等都具有其特定的數(shù)據(jù)類(lèi)型(如integer、char、money等),用來(lái)指定該對(duì)象可以存放的數(shù)據(jù)類(lèi)型以及決定數(shù)據(jù)所占用的空間,用戶可以根據(jù)數(shù)據(jù)的特性選擇一種最適合的數(shù)據(jù)類(lèi)型。例如,要存放文字的列,必須設(shè)置為文本類(lèi)型的數(shù)據(jù)類(lèi)型;要存放數(shù)字?jǐn)?shù)據(jù)做數(shù)值運(yùn)算的列,應(yīng)該設(shè)置為數(shù)值類(lèi)型的數(shù)據(jù)類(lèi)型。(1)數(shù)值數(shù)據(jù)數(shù)值數(shù)據(jù)可以用來(lái)做數(shù)值運(yùn)算處理,當(dāng)我們要存放純數(shù)字的數(shù)據(jù),或是要對(duì)存放的內(nèi)容作數(shù)值運(yùn)算時(shí),可以將它定義成數(shù)值的數(shù)據(jù)類(lèi)型。SQLServer2000提供了許多可以存放數(shù)值數(shù)據(jù)的數(shù)據(jù)類(lèi)型,如int、decimal、real等。從表2-1-1中可以看出,float(浮點(diǎn)數(shù)據(jù)類(lèi)型)可分為單精度與雙精度兩種,除了在進(jìn)行科學(xué)運(yùn)算需要較精確的值時(shí)要用到雙精度,一般情況下使用單精度就足夠了。使用浮點(diǎn)數(shù)據(jù)類(lèi)型可能會(huì)產(chǎn)生部分位數(shù)數(shù)據(jù)遺失的問(wèn)題,如單精度數(shù)據(jù)類(lèi)型,當(dāng)數(shù)值位數(shù)超過(guò)7位時(shí),會(huì)保留最前面的7位數(shù)字(數(shù)值123456789保存成單精度后會(huì)變成123456700);雙精度數(shù)據(jù)類(lèi)型會(huì)保留15位數(shù)字。當(dāng)我們要指定數(shù)值數(shù)據(jù)的數(shù)據(jù)類(lèi)型時(shí),先通過(guò)存放的數(shù)值數(shù)據(jù)是否包含小數(shù)來(lái)決定使用整數(shù)類(lèi)型的數(shù)據(jù)類(lèi)型還是帶有小數(shù)的數(shù)據(jù)類(lèi)型,再根據(jù)數(shù)值范圍選擇最適當(dāng)?shù)臄?shù)據(jù)類(lèi)型。例如,“年齡”字段是一個(gè)數(shù)值數(shù)據(jù),它通常是以正整數(shù)來(lái)表示,而且它的數(shù)值范圍通常不會(huì)超過(guò)255。為了節(jié)省空間,我們可以將它定義成tinyint數(shù)據(jù)類(lèi)型;考試平均成績(jī)數(shù)據(jù)為0~100之間的數(shù)值,通常保留兩位小數(shù),可以將它定義為5B的decimal數(shù)據(jù)類(lèi)型(1~9位數(shù)),或是單精度浮點(diǎn)數(shù)據(jù)類(lèi)型float或real。(2)貨幣數(shù)據(jù)貨幣數(shù)據(jù)是專(zhuān)門(mén)針對(duì)金額數(shù)據(jù)而定義的,是一種特殊的小數(shù)數(shù)值數(shù)據(jù),固定為4位小數(shù)。SQLServer中提供了兩種貨幣數(shù)據(jù)類(lèi)型:money與smallmoney,這兩種貨幣數(shù)據(jù)類(lèi)型的特性如表2-1-1所示。(3)日期時(shí)間數(shù)據(jù)日期時(shí)間數(shù)據(jù)用來(lái)表示日期與時(shí)間,當(dāng)我們要在表中存放日期時(shí)間信息,如出生日期、數(shù)據(jù)傳入系統(tǒng)的時(shí)間等,就可以將列定義為日期時(shí)間數(shù)據(jù)類(lèi)型。在SQLServer中,根據(jù)占用的字節(jié)以及數(shù)據(jù)的精度,定義了兩種日期時(shí)間數(shù)據(jù)類(lèi)型——datetime與smalldatetime,它們的特性說(shuō)明如表2-1-1所示。日期時(shí)間數(shù)據(jù)在系統(tǒng)中是以數(shù)值數(shù)據(jù)的形式存在的,數(shù)值整數(shù)的部分是用來(lái)指定該日期距離基準(zhǔn)日的天數(shù)。例如,系統(tǒng)的基準(zhǔn)日為1900/1/1,數(shù)值為30,表示從1900/1/1算起的第30天,也就是1900/1/30;小數(shù)部分則是用來(lái)表示時(shí)間,例如數(shù)值0.5表示半天,也就是12:00。所以日期時(shí)間數(shù)值30.5就是指1900年1月30日的上午12:00。(4)字符串?dāng)?shù)據(jù)數(shù)值數(shù)據(jù)類(lèi)型(包括貨幣數(shù)據(jù))只能允許輸入數(shù)字,而字符串?dāng)?shù)據(jù)可以包含文字、數(shù)字或其他的特殊符號(hào),幾乎所有可以在計(jì)算機(jī)上輸入的信息都可以視為字符串?dāng)?shù)據(jù)。在定義字符串?dāng)?shù)據(jù)類(lèi)型時(shí),必須指定一個(gè)數(shù)值,用來(lái)表示字符串?dāng)?shù)據(jù)的字符長(zhǎng)度。在char、varchar與text等字符串類(lèi)型中,無(wú)論是字母、數(shù)字或中文字,每一個(gè)字符都占用一個(gè)字節(jié)空間。它們的特性說(shuō)明如表2-1-2所示。①char數(shù)據(jù)類(lèi)型:char數(shù)據(jù)類(lèi)型存放固定長(zhǎng)度的字符串內(nèi)容,其最大長(zhǎng)度可達(dá)8000個(gè)字符。要保存長(zhǎng)度固定的數(shù)據(jù)(如代號(hào)),可以將它定義為char數(shù)據(jù)類(lèi)型。在char數(shù)據(jù)類(lèi)型內(nèi)存入長(zhǎng)度小于指定大小的字符串時(shí),它將會(huì)自動(dòng)在字符串后面補(bǔ)充空格填滿整個(gè)長(zhǎng)度,使數(shù)據(jù)長(zhǎng)度固定。②varchar數(shù)據(jù)類(lèi)型:varchar數(shù)據(jù)類(lèi)型比char數(shù)據(jù)類(lèi)型有彈性,可以隨著存放的數(shù)據(jù)長(zhǎng)度大小自動(dòng)調(diào)整其占用的數(shù)據(jù)空間,當(dāng)存入的數(shù)據(jù)長(zhǎng)度小于指定的大小時(shí),不會(huì)在數(shù)據(jù)后面補(bǔ)空格,而是以實(shí)際存入的數(shù)據(jù)長(zhǎng)度保存,其最大長(zhǎng)度可設(shè)置為8000個(gè)字符。當(dāng)數(shù)據(jù)內(nèi)容長(zhǎng)度的變化較大時(shí),varchar數(shù)據(jù)類(lèi)型將是較好的選擇,可以減少不必要的空間浪費(fèi)。例如,在“產(chǎn)品數(shù)據(jù)”表中“產(chǎn)品簡(jiǎn)述”字段中,有些產(chǎn)品可能需要使用200~300個(gè)字來(lái)描述,有些產(chǎn)品則只需要短短20~30個(gè)字就可以介紹完,如果將它定義為char數(shù)據(jù)類(lèi)型,則每一個(gè)產(chǎn)品的“產(chǎn)品簡(jiǎn)述”字段都固定占用200~300個(gè)字符長(zhǎng)度;如果定義為varchar數(shù)據(jù)類(lèi)型,則每一個(gè)產(chǎn)品的“產(chǎn)品簡(jiǎn)述”占用實(shí)際輸入的簡(jiǎn)述內(nèi)容的字符長(zhǎng)度。③text數(shù)據(jù)類(lèi)型:char與varchar數(shù)據(jù)類(lèi)型最大只能定義到存放8000個(gè)字符,如果要存放的數(shù)據(jù)長(zhǎng)度超過(guò)這個(gè)限制,可以使用text數(shù)據(jù)類(lèi)型。text數(shù)據(jù)類(lèi)型和varchar數(shù)據(jù)類(lèi)型一樣,都是一個(gè)可變長(zhǎng)度的數(shù)據(jù)類(lèi)型,它允許的最大長(zhǎng)度限制為231-1(2147483647)個(gè)字符。(5)Unicode數(shù)據(jù)char數(shù)據(jù)類(lèi)型、varchar數(shù)據(jù)類(lèi)型、text數(shù)據(jù)類(lèi)型是使用數(shù)據(jù)庫(kù)的字符集來(lái)定義字符串的內(nèi)容,當(dāng)要將這些數(shù)據(jù)轉(zhuǎn)移到其他使用不同字符集的數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)的轉(zhuǎn)換可能會(huì)發(fā)生錯(cuò)誤,產(chǎn)生亂碼。為了使數(shù)據(jù)能夠在不同數(shù)據(jù)庫(kù)(字符集)間順利地轉(zhuǎn)移,可以使用Unicode標(biāo)準(zhǔn)字符形式來(lái)定義字符串?dāng)?shù)據(jù),所有的字符集的字符都有對(duì)應(yīng)于這個(gè)標(biāo)準(zhǔn)的定義。Unicode字符串類(lèi)型包含nchar、nvarchar與ntext三種數(shù)據(jù)類(lèi)型,分別對(duì)應(yīng)前面的char、varchar與text數(shù)據(jù)類(lèi)型。這種Unicode標(biāo)準(zhǔn)是以2個(gè)字節(jié)代表一個(gè)字符,因此它可以允許的數(shù)據(jù)長(zhǎng)度將會(huì)是非Unicode字符串類(lèi)型的一半,也就是最大長(zhǎng)度4000個(gè)字符。如果預(yù)計(jì)要保存的數(shù)據(jù)長(zhǎng)度將會(huì)大于4000個(gè)字符,就必須將數(shù)據(jù)類(lèi)型定義為ntext。它們的特性說(shuō)明如表2-1-2所示。(6)Binary數(shù)據(jù)Binary數(shù)據(jù)是以十六進(jìn)制的方式來(lái)表示數(shù)據(jù),它可以接受1~9的數(shù)字和A~F間的字母。通常我們可以利用它來(lái)表示圖片或影像數(shù)據(jù),或者是存放特殊格式化的文件數(shù)據(jù),如Word、Excel、PDF文件等。SQLServer提供binary、varbinary以及image等3種存放Binary數(shù)據(jù)的數(shù)據(jù)類(lèi)型,它們的特性說(shuō)明如表2-1-2所示。其中binary數(shù)據(jù)類(lèi)型為一固定長(zhǎng)度的數(shù)據(jù)類(lèi)型,以固定的長(zhǎng)度處理數(shù)據(jù),當(dāng)數(shù)據(jù)長(zhǎng)度不足時(shí)會(huì)自動(dòng)填補(bǔ)到指定的固定長(zhǎng)度。varbinary與image數(shù)據(jù)類(lèi)型則是可變長(zhǎng)度的數(shù)據(jù)類(lèi)型,會(huì)隨著數(shù)據(jù)內(nèi)容調(diào)整長(zhǎng)度。通常使用varbinary數(shù)據(jù)類(lèi)型即可滿足需要,如果預(yù)期數(shù)據(jù)長(zhǎng)度超過(guò)8000個(gè)字符,可以改用image數(shù)據(jù)類(lèi)型。(7)特殊數(shù)據(jù)timestamp數(shù)據(jù)類(lèi)型是一個(gè)binary的遞增數(shù)據(jù)類(lèi)型,在數(shù)據(jù)行加入或更改時(shí)自動(dòng)產(chǎn)生,產(chǎn)生的值在數(shù)據(jù)庫(kù)中是唯一的,不會(huì)有重復(fù),通??梢允褂盟鼇?lái)作為列的版本戳記。由于這個(gè)時(shí)間戳記會(huì)隨著數(shù)據(jù)行的變動(dòng)而更改,因此最好不要將它設(shè)置為表的索引鍵,而且在一個(gè)表中也應(yīng)該只會(huì)有一個(gè)timestamp數(shù)據(jù)類(lèi)型的列。timestamp列的內(nèi)容是根據(jù)@@DBTS函數(shù)所取得的目前數(shù)據(jù)庫(kù)時(shí)間戳記數(shù)值而更新的,與數(shù)據(jù)行插入或更改的日期與時(shí)間沒(méi)有直接的關(guān)系。如果用戶想要自動(dòng)記錄表中數(shù)據(jù)修改的時(shí)間,應(yīng)該要使用datetime或smalldatetime數(shù)據(jù)類(lèi)型,并利用事件觸發(fā)程序來(lái)寫(xiě)入日期時(shí)間數(shù)據(jù),其特性說(shuō)明如表2-1-2所示。(8)Cursor數(shù)據(jù)類(lèi)型SQLServer2005中,游標(biāo)(Cursor)類(lèi)似于C語(yǔ)言指針結(jié)構(gòu),其特性說(shuō)明如表2-1-2所示,游標(biāo)是一種數(shù)據(jù)訪問(wèn)機(jī)制,允許用戶訪問(wèn)單獨(dú)的數(shù)據(jù)行,而不是對(duì)整個(gè)行集進(jìn)行操作。用戶可以通過(guò)單獨(dú)處理每行逐條收集信息并對(duì)數(shù)據(jù)逐行進(jìn)行操作,也可以使用這些數(shù)據(jù)生成SQL代碼并立即執(zhí)行或輸出。游標(biāo)主要包括游標(biāo)結(jié)果集和游標(biāo)位置兩部分,游標(biāo)結(jié)果集是由定義游標(biāo)的SELECT語(yǔ)句返回的行的集合,游標(biāo)位置則是指向這個(gè)結(jié)構(gòu)集中的某一行的指針。3.使用SSMS設(shè)計(jì)表在SQLServerManagementStudio管理工具中,可以利用“表設(shè)計(jì)”窗口來(lái)定義表的列屬性與數(shù)據(jù)特性。表設(shè)計(jì)窗口的界面如圖2-1-8所示,分為上下兩個(gè)窗格,上面的窗格是用來(lái)定義表中每一個(gè)列的主要屬性,如列名、數(shù)據(jù)類(lèi)型、是否允許空;下方的窗格是“列屬性”窗格,針對(duì)選取的列,定義該列的其他數(shù)據(jù)屬性,如默認(rèn)值、精度、小數(shù)位數(shù)等。另外,在窗口上方的工具欄上還有一些工具按鈕可以管理表的索引鍵、定義表間的關(guān)系,如圖2-1-9所示。圖2-1-8表設(shè)計(jì)窗口圖2-1-9“屬性”工具欄(1)列的主要屬性“列名”字段:用來(lái)唯一標(biāo)識(shí)表內(nèi)每一個(gè)列的名稱(chēng),表內(nèi)列名的名稱(chēng)不能相同,也不能使用Transact-SQL的保留字,而且不能包含空格或其他的特殊符號(hào)?!皵?shù)據(jù)類(lèi)型”字段:用來(lái)指定存放于該表內(nèi)數(shù)據(jù)的數(shù)據(jù)類(lèi)型,存入的數(shù)據(jù)必須與指定的數(shù)據(jù)類(lèi)型相符,否則將會(huì)產(chǎn)生類(lèi)型不符的錯(cuò)誤??梢愿鶕?jù)要存放信息的數(shù)據(jù)特性,并根據(jù)前面介紹的數(shù)據(jù)類(lèi)型說(shuō)明,為屬性列定義一個(gè)適合的數(shù)據(jù)類(lèi)型?!霸试S空”字段:用來(lái)設(shè)置是否允許這個(gè)列的內(nèi)容為空,可以選中或取消這個(gè)復(fù)選框。當(dāng)列被設(shè)置為“允許空”時(shí),如果沒(méi)有為這個(gè)列指定任何的數(shù)據(jù),將會(huì)使用“空”作為默認(rèn)值存放到列。反之,如果設(shè)置列“不允許空”,就必須自行為列指定默認(rèn)值,否則在插入數(shù)據(jù)行時(shí),若未指定任何數(shù)據(jù)給該列,就會(huì)發(fā)生錯(cuò)誤。(2)列的其他屬性隨著列定義的數(shù)據(jù)類(lèi)型的不同,部分的屬性項(xiàng)目可能無(wú)法設(shè)置,使用列的其他屬性可以個(gè)別設(shè)置各個(gè)列屬性,如圖2-1-10所示。①“長(zhǎng)度”字段:用來(lái)指定列的字節(jié)數(shù),隨著指定的數(shù)據(jù)類(lèi)型的不同,長(zhǎng)度字段所代表的含義也會(huì)有所不同。在字符串?dāng)?shù)據(jù)類(lèi)型中,此字段值代表字符串的長(zhǎng)度,可以修改該字段值,調(diào)整適當(dāng)?shù)淖址L(zhǎng)度來(lái)存放數(shù)據(jù);對(duì)于數(shù)值數(shù)據(jù)類(lèi)型,其所占的字節(jié)數(shù)是固定的,無(wú)法更改這個(gè)字段值。②“默認(rèn)值”字段:設(shè)置當(dāng)插入數(shù)據(jù)行而未指定列數(shù)據(jù)時(shí)存入列內(nèi)的默認(rèn)值,根據(jù)設(shè)置的數(shù)據(jù)類(lèi)型,此值可以是文字、數(shù)字或日期時(shí)間數(shù)據(jù),也可以是一個(gè)函數(shù)。當(dāng)某個(gè)字段在每條記錄中的大部分值都保持不變的時(shí)候,我們可以設(shè)置默認(rèn)值用來(lái)自動(dòng)填寫(xiě)用戶經(jīng)常重復(fù)輸入的數(shù)據(jù)。在“選課管理”數(shù)據(jù)庫(kù)的“學(xué)生基本檔案”表中,學(xué)生的“民族”多數(shù)為“漢族”,在這種情況下,可以用一個(gè)默認(rèn)值自動(dòng)填充該字段。以后,每當(dāng)輸入新學(xué)生記錄或者重新輸入現(xiàn)有記錄時(shí),該字段中將自動(dòng)填入“漢族”,可以節(jié)省時(shí)間。③“說(shuō)明”字段:這個(gè)字段主要提供作為“列的批注”說(shuō)明,使管理者在維護(hù)時(shí),方便了解該列所存放的信息??梢栽谶@個(gè)字段中輸入任何的字符串文字,當(dāng)然也可以忽略不填。④“精度”與“小數(shù)位數(shù)”字段:這兩個(gè)字段只有在屬于Decimal或Numeric小數(shù)數(shù)據(jù)類(lèi)型的列中設(shè)置,分別用來(lái)指定整個(gè)數(shù)值數(shù)據(jù)的數(shù)值位數(shù)與小數(shù)位數(shù),默認(rèn)為(18,0),表示該列可以存放18位數(shù)的整數(shù)數(shù)據(jù)(因?yàn)樾?shù)位數(shù)為0);在存放分?jǐn)?shù)的列中,分?jǐn)?shù)范圍為0~100,且要保留兩位小數(shù)位置,可以將“精度”字段設(shè)置為5,“小數(shù)位數(shù)”字段設(shè)置為2。⑤“標(biāo)識(shí)規(guī)范”字段(使用IDENTITY關(guān)鍵字定義的字段):用來(lái)設(shè)置是否要將列定義為標(biāo)識(shí)列,自動(dòng)產(chǎn)生列的內(nèi)容。當(dāng)我們將列設(shè)置為標(biāo)識(shí)字段時(shí),它會(huì)自動(dòng)以“標(biāo)識(shí)種子”字段的內(nèi)容作為列的初始值,然后以每次增加“標(biāo)識(shí)增量”的方式,自動(dòng)為新建的數(shù)據(jù)行指定該列內(nèi)容。一個(gè)標(biāo)識(shí)字段是唯一標(biāo)識(shí)表中每條記錄的特殊字段,當(dāng)一條記錄添加到這個(gè)表中時(shí),這個(gè)字段就被自動(dòng)賦給一個(gè)新值。默認(rèn)情況下是+1遞增。例如,在“學(xué)生基本⑥信息表”中,我們希望在新建學(xué)生數(shù)據(jù)時(shí),自動(dòng)產(chǎn)生學(xué)生編號(hào),可以將“學(xué)員編號(hào)”列的“標(biāo)識(shí)”屬性設(shè)置為“是”,并將“標(biāo)識(shí)增量”定義為1,這樣每一條加入的“學(xué)員編號(hào)”都會(huì)自動(dòng)遞增。只有在整數(shù)數(shù)據(jù)類(lèi)型(如int、smallint、tinyint)或無(wú)小數(shù)字?jǐn)?shù)的decimal或numeric數(shù)據(jù)類(lèi)型可以設(shè)置標(biāo)識(shí)選項(xiàng)。每個(gè)表可以有一個(gè)標(biāo)識(shí)字段,也只能有一個(gè)標(biāo)識(shí)字段。使用IDENTITY型數(shù)據(jù)只能向表中添加255條記錄。在SQLServer2005系統(tǒng)中,即可以使用表設(shè)計(jì)器定義標(biāo)識(shí)字段,也可以在CREATETABLE語(yǔ)句中定義。RowGuid字段:這個(gè)字段只有在uniqueidentifier數(shù)據(jù)類(lèi)型的列中才可以設(shè)置,若將它設(shè)為“是”,SQL會(huì)自動(dòng)將NEWID()函數(shù)加入到默認(rèn)值字段中,使得每當(dāng)數(shù)據(jù)加入到表時(shí),列自動(dòng)取得GUID值。⑦“公式”字段:當(dāng)列的值與其他列的值有關(guān)聯(lián)時(shí),可以在公式字段上輸入表達(dá)式,自動(dòng)計(jì)算列的內(nèi)容。例如,在“產(chǎn)品銷(xiāo)售表”中,可以根據(jù)“單價(jià)”與“數(shù)量”求得“小計(jì)”信息,因此可以在“小計(jì)”列的“公式”字段上輸入公式“單價(jià)×數(shù)量”,這樣,如果以后要加入數(shù)據(jù),只要輸入單價(jià)和數(shù)量的信息,就可以自動(dòng)計(jì)算出小計(jì)信息。⑧“排序規(guī)則”字段:用來(lái)設(shè)置列的字串?dāng)?shù)據(jù)比對(duì)、排序方式,可以直接使用默認(rèn)的“<數(shù)據(jù)庫(kù)默認(rèn)值>”,沿用數(shù)據(jù)庫(kù)的排序規(guī)則方式;或者是單擊字段右方的“瀏覽”按鈕,打開(kāi)如圖2-1-11所示的“排序規(guī)則”對(duì)話框,自行定義數(shù)據(jù)行的排序方式。圖2-1-10“列屬性”界面圖2-1-11“排序規(guī)則”對(duì)話框4.創(chuàng)建表主鍵主鍵是用來(lái)唯一標(biāo)識(shí)每一個(gè)數(shù)據(jù)列,在表中具有唯一性,絕對(duì)不會(huì)有重復(fù),每一個(gè)表都可以定義一個(gè)主鍵,可以是單一列,也可以是由多個(gè)列叢集而成。例如,【案例4】創(chuàng)建的“學(xué)生基本檔案”表中,每一位學(xué)生都有自己的學(xué)號(hào),我們可以由“學(xué)號(hào)”來(lái)標(biāo)識(shí)唯一的信息數(shù)據(jù),可以將“學(xué)號(hào)”字段設(shè)置為“學(xué)生基本檔案”表的主鍵。具體操作步驟如下所述。①啟動(dòng)SQLServerManagementStudio程序,在“對(duì)象資源管理器”窗格中依次展開(kāi)“數(shù)據(jù)庫(kù)”結(jié)點(diǎn)→“選課管理”數(shù)據(jù)庫(kù)結(jié)點(diǎn)。②展開(kāi)“表”結(jié)點(diǎn),右擊“學(xué)生基本檔案”表,在彈出的快捷菜單中選擇“修改”命令。③打開(kāi)表設(shè)計(jì)器窗口,如圖2-1-12所示,選擇要定義為主鍵的列,例如選擇“學(xué)號(hào)”列,在工具欄上按下創(chuàng)建主鍵工具按鈕,如圖2-1-12所示。④這時(shí)可以在“學(xué)號(hào)”列的前面看到鑰匙圖標(biāo)標(biāo)識(shí),如圖2-1-13所示,表示該列已經(jīng)被定義為表的主鍵,單擊“保存”按鈕,保存設(shè)置。⑤如果表內(nèi)需要由多個(gè)列叢集成主鍵,可以在設(shè)計(jì)窗口中利用【Ctrl】鍵或【Shift】鍵,單擊選中多個(gè)列,然后再單擊工具按鈕創(chuàng)建主鍵,這樣所有被選取的列的前面都會(huì)出現(xiàn)鑰匙圖標(biāo)。⑥定義好主鍵之后,SQLServer就會(huì)自動(dòng)維護(hù)主鍵的唯一性,不允許存在相同的值。在定義主鍵時(shí),必須注意不能將設(shè)置為允許空的列指定為表的主鍵。

5.使用CREATETABLE指令創(chuàng)建表 除了可以使用表設(shè)計(jì)窗口創(chuàng)建表,還可以使用Transact-SQL語(yǔ)法中的CREATETABLE指令來(lái)創(chuàng)建表。語(yǔ)法格式如下:CREATE(TABLE表名字段名1字段名2…字段名n數(shù)據(jù)類(lèi)型(長(zhǎng)度)數(shù)據(jù)類(lèi)型(長(zhǎng)度)數(shù)據(jù)類(lèi)型(長(zhǎng)度)[其他字段屬性],[其他字段屬性],[其他字段屬性],

)

在CREATETABLE語(yǔ)句后面輸入要?jiǎng)?chuàng)建的表名,語(yǔ)句小括號(hào)內(nèi)依序定義每一個(gè)列的名稱(chēng)、數(shù)據(jù)類(lèi)型、長(zhǎng)度等字段屬性,在不同的字段定義中使用逗號(hào)隔開(kāi)。 例如,在“選課管理”數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名稱(chēng)為“課程信息”的表,用來(lái)存放課程信息,其表結(jié)構(gòu)如圖2-1-14所示,包含課程代號(hào)、課程名稱(chēng)與課程學(xué)分三個(gè)字段,以“課程代號(hào)”列作為其主鍵。圖2-1-12選擇要定義為主鍵的列圖2-1-13定義為主鍵后的效果,①選擇“開(kāi)始”→“程序”→MicrosoftSQLServer2005命令,打開(kāi)SQLServerManagementStudio窗口,使用“Windows身份驗(yàn)證”或者是“SQLServer身份驗(yàn)證”建立連接。②單擊“文件”菜單,依次選擇“新建”→“數(shù)據(jù)庫(kù)引擎查詢”命令,或者單擊“新建查詢”按鈕創(chuàng)建一個(gè)查詢輸入窗口。③在如圖2-1-15所示的窗口中輸入Transact-SQL語(yǔ)句。以創(chuàng)建“課程信息”表為例,語(yǔ)句格式如下:CREATETABLE課程信息(課程代號(hào)char(2)PRIMARYKEY,課程名稱(chēng)varchar(10),課程符號(hào)varchar(6))語(yǔ)句中的PRIMARYKEY表示設(shè)置該列為主鍵,在這個(gè)關(guān)鍵詞后可以加上CLUSTERED或NONCLUSTERED關(guān)鍵詞,用來(lái)表示該索引鍵為叢集索引,或者非叢集索引,如果沒(méi)有指定,默認(rèn)為NONCLUSTERED非叢集索引。如果要為列指定默認(rèn)值,可以在該列定義后面加上DEFAULT關(guān)鍵詞并指定默認(rèn)值。其他可用的列屬性關(guān)鍵詞說(shuō)明如表2-1-3所示。ll圖2-1-14“課程信息”表圖2-1-15在窗口中輸入Transact-SQL語(yǔ)句6.使用IDENTITY關(guān)鍵字①使用SSMS定義標(biāo)識(shí)字段打開(kāi)SQLServerManagementStudio窗口,在“對(duì)象資源管理器”窗格中依次展開(kāi)“數(shù)據(jù)庫(kù)”結(jié)點(diǎn)→“選 課管理”數(shù)據(jù)庫(kù)結(jié)點(diǎn)。右擊“表”結(jié)點(diǎn),選擇“新建表”命令,打開(kāi)表設(shè)計(jì)器窗口。lll輸入字段的名稱(chēng)和類(lèi)型后,在表設(shè)計(jì)器里展開(kāi)“標(biāo)識(shí)規(guī)范”結(jié)點(diǎn),在“是標(biāo)識(shí)”后面的下拉列表中選擇“是”, 標(biāo)量增量和標(biāo)量種子按需要更改即可。②IDENTITY子句格式使用CREATETABLE語(yǔ)句創(chuàng)建表時(shí),IDENTITY子句的格式如下所述。

IDENTITY(seed,increment)

參數(shù)說(shuō)明:

seed表示標(biāo)量種子,即用于指定標(biāo)識(shí)的初始值;

increment表示標(biāo)量增量,即用于指定標(biāo)識(shí)列的增量值。 例如,新設(shè)計(jì)一個(gè)簡(jiǎn)單的學(xué)生信息表,要求學(xué)生編號(hào)為標(biāo)識(shí)列,標(biāo)量種子為2,標(biāo)量增量為2,具體代碼如下:

USE選課管理

GO CREATETABLE學(xué)生信息(學(xué)生編號(hào)intIDENTITY(2,2),學(xué)生姓名nvarchar(10),手機(jī)號(hào)碼nvarchar(16),)向新建的表中插入幾條數(shù)據(jù),會(huì)發(fā)現(xiàn)“學(xué)生編號(hào)”列自動(dòng)按照標(biāo)量種子為2、標(biāo)量增量為2遞增。2.2【案例5】添加記錄相關(guān)知識(shí)1.使用SSMS進(jìn)行記錄操作①啟動(dòng)SQLServerManagementStudio程序,在“對(duì)象資源管理器”窗格中依次展開(kāi)“數(shù)據(jù)庫(kù)”結(jié)點(diǎn)→“選課管理”數(shù)據(jù)庫(kù)結(jié)點(diǎn)→“表”結(jié)點(diǎn)。②選擇“學(xué)生基本檔案”表并右擊,選擇“打開(kāi)表”命令,如圖2-2-3所示。③在SQLServerManagementStudio窗口中,可以直接在圖2-2-4所示的表格中添加、修改表中記錄的操作。④如果要?jiǎng)h除記錄,選定要?jiǎng)h除的記錄并右擊,選擇“刪除”命令即可。⑤記錄操作完成后,根據(jù)提示保存操作結(jié)果則完成表中記錄的操作。圖2-2-3選擇“打開(kāi)表”命令圖2-2-4在表格中直接添加、修改記錄

2.使用INSERTINTO語(yǔ)句添加記錄

Transact-SQL語(yǔ)法中提供了INSERTINTO語(yǔ)句,使用INSERTINTO語(yǔ)句可以向表中添加記錄或者創(chuàng)建追加查詢,插入單個(gè)記錄的基本語(yǔ)句格式如下:llllINSERTINTO表名([<屬性列1>[,<屬性列2>…]])VALUES(常量1[,常量n])

其語(yǔ)法解釋如下: 在INSERTINTO關(guān)鍵詞后指定要加入記錄的表名,在小括號(hào)內(nèi)以逗號(hào)分隔不同的列名,沒(méi)有出現(xiàn)在小括號(hào) 內(nèi)的列將會(huì)存入默認(rèn)值或NULL,在VALUES關(guān)鍵詞后依序指定要存入列內(nèi)的內(nèi)容值。 如果沒(méi)有指明任何列名,則新插入的記錄必須在每個(gè)屬性列上有值。如果某些屬性列在表名后的列名表沒(méi) 有出現(xiàn),則新記錄在這些列上將取空值(NILL)。但是,如果在表定義時(shí)說(shuō)明了NOTNULL的屬性列不能取 空值,新記錄在這些列上將不能取空值,否則系統(tǒng)會(huì)出現(xiàn)錯(cuò)誤提示。INSERT語(yǔ)句中的INTO可以省略。 字符型數(shù)據(jù)必須使用“’”將其引起來(lái)。 常量的順序必須和指定的列名順序保持一致。 例如,要在“課程信息”表中加入課程信息(課程代號(hào)為C010,課程名稱(chēng)為“計(jì)算機(jī)網(wǎng)絡(luò)”,課程學(xué)分為4分,先修課代號(hào)為C001),在打開(kāi)“選課管理”數(shù)據(jù)庫(kù)的前提下,執(zhí)行下面的INSERTINTO語(yǔ)句,單擊“執(zhí)行”按鈕,效果如圖2-2-5所示。

INSERTINTO課程信息(課程代號(hào),課程名稱(chēng),課程學(xué)分,先修課代號(hào))VALUES('C010','計(jì)算機(jī)網(wǎng)絡(luò)

',4,'C001') 3.使用UPDATE語(yǔ)句修改記錄

使用T-SQL語(yǔ)句可以完成表中記錄的修改操作,其中包括修改單條記錄、修改多條記錄和修改多個(gè)屬性的多條記錄。使用UPDATE語(yǔ)句可以按照某個(gè)條件修改特定表中的字段值,其基本語(yǔ)句格式如下:UPDATE<表名>SET<列名>=<表達(dá)式>[,<列名>=<表達(dá)式>]…[FROM[WHERE<表名>] <條件>];圖2-2-5使用INSERTINTO語(yǔ)句添加記錄其功能是修改指定表中滿足WHERE子句條件的記錄。其中SET子句用于指定修改方法,即用<表達(dá)式>的值取代相應(yīng)的屬性列值。如果省略WHERE子句,則表示要修改表中的所有記錄。修改記錄時(shí)可以通過(guò)約束和觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)完整性。(1)修改指定屬性的單條記錄例如:對(duì)“選課管理”數(shù)據(jù)庫(kù)中的“課程信息”表進(jìn)行操作,將“數(shù)據(jù)結(jié)構(gòu)”課程的學(xué)分由4學(xué)分修改為5學(xué)分,完成對(duì)該課程“學(xué)分”的更改。完成該操作的T-SQL語(yǔ)句格式如下,效果如圖2-2-6所示。UPDATE課程信息SET課程學(xué)分=5WHERE課程名稱(chēng)='數(shù)據(jù)結(jié)構(gòu)'(2)修改多條記錄例如:對(duì)“選課管理”數(shù)據(jù)庫(kù)中的“成績(jī)”表進(jìn)行操作,將所有學(xué)生的成績(jī)加2分。完成該操作的T-SQL語(yǔ)句格式如下,效果如圖2-2-7所示。UPDATE成績(jī)SET成績(jī)=成績(jī)+2圖2-2-6修改單條記錄圖2-2-7修改多條記錄

(3)修改多個(gè)屬性的多條記錄 如果要修改多列,則在SET語(yǔ)句后用“,”分隔各修改子句。例如:對(duì)“選課管理”數(shù)據(jù)庫(kù)中的“學(xué)生基本檔案”表進(jìn)行操作,將所有學(xué)生的年齡加1歲,并將所有的入學(xué)日期調(diào)整為2008年8月15日。 完成該操作的T-SQL語(yǔ)句格式如下,效果如圖2-2-8所示。

UPDATE學(xué)生基本檔案

SET年齡=年齡+1,入學(xué)日期='2008-08-15' 4.使用DELETE語(yǔ)句刪除記錄 使用T-SQL語(yǔ)句完成表中記錄的刪除操作,包括刪除指定和刪除所有記錄。使用DELETE語(yǔ)句刪除表中的記錄,其基本語(yǔ)句格式如下:DELETEFROM<表名>[WHERE<條件>]

DELETE語(yǔ)句的功能是從指定表中刪除滿足WHERE子句條件的所有記錄。如果省略WHERE子句,表示刪除表中全部記錄,但表的定義仍存在,即DELETE語(yǔ)句刪除的是表中的數(shù)據(jù),而不是表的結(jié)構(gòu)。 (1)刪除指定記錄 例如:對(duì)“選課管理”數(shù)據(jù)庫(kù)中的“課程信息”表進(jìn)行操作,刪除課程代號(hào)為C010的課程信息。 完成該操作的T-SQL語(yǔ)句格式如下,效果如圖2-2-9所示。

DELETE FROM課程信息

WHERE課程代號(hào)='C010' DELETE刪除一次只能操作一個(gè)表,因此會(huì)遇到數(shù)據(jù)不一致的問(wèn)題。例如商品號(hào)為040002商品被刪除后,包含該商品的價(jià)格信息也應(yīng)同時(shí)刪除。如果是外鍵約束,則可以先將外鍵表中對(duì)應(yīng)的記錄刪除,然后再刪除主鍵表中的記錄。記錄刪除后不能被恢復(fù)。 這里涉及的數(shù)據(jù)完整性問(wèn)題請(qǐng)參閱本章的2.3節(jié)。圖2-2-8修改多個(gè)屬性的多條記錄圖2-2-9刪除指定記錄(2)刪除所有記錄 例如:對(duì)“選課管理”數(shù)據(jù)庫(kù)中“課程信息”表進(jìn)行操作,刪除“課程信息”表中的所有信息。 完成該操作的T-SQL語(yǔ)句格式如下,效果如圖2-2-10所示。DELETEFROM課程信息該語(yǔ)句使“課程信息”表成為空表,它刪除了“課程信息”表的所有記錄。圖2-2-10刪除“課程信息”表2.3【案例6】維護(hù)“學(xué)生基本檔案”表為確保數(shù)據(jù)不丟失同步,可以在兩個(gè)表之間添加關(guān)系強(qiáng)制引用完整性。引用完整性是一種規(guī)則體系,這些規(guī)則可確保相關(guān)表中各行間關(guān)系的有效性,并確保不會(huì)意外地刪除或更改相關(guān)的數(shù)據(jù)。引用完整性關(guān)系有助于確保一個(gè)表中的信息與另一個(gè)表中的信息匹配。例如“成績(jī)”表中不允許出現(xiàn)“學(xué)生基本檔案”表中不存在的“學(xué)號(hào)”。相關(guān)知識(shí)1.使用SSMS修改表結(jié)構(gòu)在數(shù)據(jù)庫(kù)設(shè)計(jì)完成后,有時(shí)要求對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行修改,可以使用SQLServerManagementStudio對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行修改。①啟動(dòng)SQLServerManagementStudio程序,在“對(duì)象資源管理器”窗格中依次展開(kāi)“數(shù)據(jù)庫(kù)”結(jié)點(diǎn)→“選課管理”數(shù)據(jù)庫(kù)結(jié)點(diǎn)→“表”結(jié)點(diǎn)。②在“學(xué)生基本檔案”表上右擊,選擇“修改”命令,如圖2-3-10所示。③選中“政治面貌”屬性列并右擊,選擇“插入列”命令,如圖2-3-11所示。④出現(xiàn)一個(gè)空白列,輸入屬性列名“電話”,類(lèi)型為“char(11)”,允許“空”,如圖2-3-12所示。⑤單擊“保存”按鈕,保存“學(xué)生基本檔案”表,打開(kāi)如圖2-3-13所示的“保存”對(duì)話框,單擊“是”按鈕。圖2-3-10選擇“修改”命令圖2-3-11選擇“插入列”命令圖2-3-12插入“電話”屬性列圖2-3-13“保存”對(duì)話框

2.使用SSMS重命名表 ①啟動(dòng)SQLServerManagementStudio程序,在“對(duì)象資源管理器”窗格中依次展開(kāi)“數(shù)據(jù)庫(kù)”結(jié)點(diǎn)→“選課管理”數(shù)據(jù)庫(kù)結(jié)點(diǎn)→“表”結(jié)點(diǎn)。 ②在“課程信息”表上右擊,選擇“重命名”命令,如圖2-3-14所示。③輸入新的表名“課程”,如圖2-3-15所示。圖2-3-14選擇“重命名”命令圖2-3-15輸入新表名3.使用ALTERTABLE語(yǔ)句修改表結(jié)構(gòu)使用ALTERTABLE語(yǔ)句可以對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行修改,包括添加新列、增加新約束條件、修改原有的列定義],和刪除已有的列和約束條件。 其基本語(yǔ)句格式如下:ALTERTABLE<表名>[ALTERCOLUMN<列名><.新數(shù)據(jù)類(lèi)型>[NULL/NOTNULL]][ADD<新列名><數(shù)據(jù)類(lèi)型>[完整性約束][NULL/NOTNULL][DROPCOLUMN<完整性約束名>]

其中<表名>指定需要修改的表,ALTERCOLUMN子句用于修改原有的列定義(主要是數(shù)據(jù)類(lèi)型),ADD子句用于增加新列和新的完整性約束條件,DROP子句用于刪除指定的完整性約束條件或指定的列。 (1)添加列

【案例6-1】要在“學(xué)生基本檔案”表中添加一個(gè)屬性列,名稱(chēng)為“電話”,長(zhǎng)度為11個(gè)字符,類(lèi)型為char。該操作可以使用T-SQL語(yǔ)句完成,具體操作如下所述。 ①選擇“開(kāi)始”→“程序”→MicrosoftSQLServer2005命令,打開(kāi)SQLServerManagementStudio窗口,使用“Windows身份驗(yàn)證”或者是“SQLServer身份驗(yàn)證”建立連接。 ②單擊“文件”菜單,依次選擇“新建”→“數(shù)據(jù)庫(kù)引擎查詢”命令,或者單擊“新建查詢”按鈕創(chuàng)建一個(gè)查詢輸入窗口。。

③在工具欄中單擊master下拉列表,在“可用的數(shù)據(jù)庫(kù)”列表中選擇“選課管理”數(shù)據(jù)庫(kù),在如圖2-3-16所示的查詢窗口內(nèi)輸入Transact-SQL語(yǔ)句,然后單擊“執(zhí)行”按鈕 語(yǔ)句格式如下:ALTERTABLE學(xué)生基本檔案ADD電話char(11)NULL ④在ALTERTABLE語(yǔ)句中使用ADD關(guān)鍵字增加列,無(wú)論表中原來(lái)是否已有數(shù)據(jù),新增加的列一律為空值,且新增加的一列位于表結(jié)構(gòu)的末尾,如圖2-3-17所示。圖2-3-16選擇“選課管理”數(shù)據(jù)庫(kù)并輸入T-SQL語(yǔ)句

(2)修改列 在ALTERTABLE語(yǔ)句中可以使用ALTERCOLUMN關(guān)鍵字修改列的數(shù)據(jù)類(lèi)型或?qū)挾取?/p>

【案例6-2】考慮到“入學(xué)日期”的實(shí)際長(zhǎng)度和數(shù)據(jù)操作的方便性,將“學(xué)生基本檔案”表中的“入學(xué)日期”數(shù)據(jù)類(lèi)型改為char型,且寬度為10。圖2-3-17增加的“電話”列

該操作可以使用T-SQL語(yǔ)句完成,新建“查詢”窗口,輸入如下T-SQL語(yǔ)句,并單擊“執(zhí)行”按鈕,如圖2-3-18所示。

ALTERTABLE學(xué)生基本檔案ALTERCOLUMN入學(xué)日期char(10)

該語(yǔ)句可以將“入學(xué)日期”列的數(shù)據(jù)類(lèi)型由datetime修改為char,在“對(duì)象資源管理器”窗格中展開(kāi)“學(xué)生基本檔案”表結(jié)點(diǎn),展開(kāi)“列”結(jié)點(diǎn)可以查看指定表中列的信息,修改后的結(jié)果如圖2-3-19所示。圖2-3-18輸入修改列的T-SQL語(yǔ)句圖2-3-19展開(kāi)“列”結(jié)點(diǎn)

(3)刪除列 用ALTERTABLE語(yǔ)句刪除列,可用DROPCOLUMN關(guān)鍵字。

【案例6-3】要將“學(xué)生基本檔案”表中的“電話”列刪除。 該操作可以使用T-SQL語(yǔ)句完成,新建“查詢”窗口,輸入如下T-SQL語(yǔ)句,并單擊“執(zhí)行”按鈕。

ALTERTABLE學(xué)生基本檔案DROPCOLUMN電話 使用ALTERTABLE時(shí),每次只能添加或者刪除一列,在添加列時(shí),不需要帶關(guān)鍵字COLUMN;在刪除列時(shí),在列名前要帶上關(guān)鍵字COLUMN,因?yàn)槟J(rèn)情況下認(rèn)為是刪除約束。在添加列時(shí),需要帶數(shù)據(jù)類(lèi)型和長(zhǎng)度;在刪除列時(shí),不需要帶數(shù)據(jù)類(lèi)型和長(zhǎng)度,只要指定列名。 如果在該列定義了約束,在修改列時(shí)會(huì)進(jìn)行限制,如果確實(shí)要修改該列,可以先不許刪除該列上的約束,然后再進(jìn)行修改。

4.使用DROPTABLE語(yǔ)句刪除表 使用DROPTABLE可以刪除數(shù)據(jù)庫(kù)的表,其基本語(yǔ)句格式如下所示。DROPTABLE<表名>

<表名>指要?jiǎng)h除的表名?!景咐?-4】要將“新課程信息”表從“選課管理”數(shù)據(jù)庫(kù)中刪除。該操作可使用T-SQL語(yǔ)句完成,完成語(yǔ)llll句如下所示。DROPTABLE'新課程信息'

該語(yǔ)句刪除“選課管理”數(shù)據(jù)庫(kù)中的“新課程信息”表。表定義一旦刪除,表中的數(shù)據(jù)、在此表上建立的索引都將自動(dòng)被刪除掉,而建立在此表上的視圖雖仍然保留,但已無(wú)法引用。因此,執(zhí)行刪除操作時(shí)一定要格外小心。

2.4【案例7】數(shù)據(jù)完整性 相關(guān)知識(shí)

1.?dāng)?shù)據(jù)庫(kù)完整性概述 數(shù)據(jù)完整性是指數(shù)據(jù)的一致性和可靠性。它是為防止數(shù)據(jù)庫(kù)中存在不符合語(yǔ)義規(guī)定的數(shù)據(jù),防止因錯(cuò)誤信息的輸入、輸出而造成無(wú)效的操作或錯(cuò)誤信息而提出的。 數(shù)據(jù)完整性分為4類(lèi): 實(shí)體完整性(EntityIntegrity)。 域完整性(DomainIntegrity)。 參照完整性(ReferentialIntegrity)。 用戶定義的完整性(User-definedIntegrity)。ll(1)實(shí)體完整性實(shí)體完整性規(guī)定:表的每一行在表中是唯一的實(shí)體。實(shí)體表中定義的索引、UNIQUE約束、PRIMARYKEY約束和IDENTITY約束就是實(shí)體完整性的體現(xiàn)。實(shí)體完整性要求所有行都具有唯一標(biāo)識(shí)。在SQLServer中,可以通過(guò)建立唯一索引表、UNIQUE、PRIMARYKEY和IDENTITY約束等措施來(lái)實(shí)施實(shí)體完整性。(2)域完整性域完整性也稱(chēng)列完整性,是指數(shù)據(jù)庫(kù)表中的列必須滿足某種特定的數(shù)據(jù)類(lèi)型或約束,它要求域中指定的列(字段)的數(shù)據(jù)具有正確的數(shù)據(jù)類(lèi)型、格式和有效的數(shù)值范圍。域完整性通過(guò)表中的CHECK約束、FOREIGNKEY約束、DEFAULT定義、NOTNULL和規(guī)則等數(shù)據(jù)庫(kù)對(duì)象來(lái)實(shí)現(xiàn)。(3)參照完整性參照完整性是指兩個(gè)表的關(guān)鍵字(主鍵)和關(guān)鍵字(外鍵)的數(shù)據(jù)對(duì)應(yīng)一致。它確保了有主關(guān)鍵字的表中對(duì)應(yīng)其他表的外關(guān)鍵字的行存在對(duì)應(yīng)關(guān)系,保證了表之間的數(shù)據(jù)的一致性;防止了數(shù)據(jù)丟失或無(wú)意義的數(shù)據(jù)在數(shù)據(jù)庫(kù)中擴(kuò)散;是建立在外關(guān)鍵字和主關(guān)鍵字之間或外關(guān)鍵字和唯一性關(guān)鍵字之間的關(guān)系上的。在SQLServer中,參照完整性的作用表現(xiàn)在以下幾個(gè)方面:禁止在從表中插入包含主表中不存在的關(guān)鍵字的數(shù)據(jù)行。禁止會(huì)導(dǎo)致從表中的相應(yīng)值孤立的主表中的外關(guān)鍵字值改變。l禁止刪除在從表中有對(duì)應(yīng)記錄的主表記錄。(4)用戶定義的完整性用戶定義完整性指的是由用戶指定的一組規(guī)則,它不屬于實(shí)體完整性、域完整性或引用完整性。允許用戶定義不屬于其他任何一類(lèi)完整性的特定規(guī)則(例如,實(shí)現(xiàn)郵政編碼的規(guī)則、使用CREATETABLE中的所有列級(jí)和表級(jí)約束、存儲(chǔ)過(guò)程和觸發(fā)器都屬于用戶定義的完整性)。用戶定義的完整性是針對(duì)某個(gè)特定關(guān)系數(shù)據(jù)庫(kù)的約束條件的,它反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語(yǔ)義要求。SQLServer提供了定義和檢驗(yàn)這類(lèi)完整性的機(jī)制,以便用統(tǒng)一的系統(tǒng)方法來(lái)處理它們,而不是用應(yīng)用程序來(lái)承擔(dān)這一功能,其他的完整性類(lèi)型都支持用戶定義的完整性。SQLServer提供了一些工具來(lái)幫助用戶實(shí)現(xiàn)數(shù)據(jù)完整性,其中最主要的是:規(guī)則(Rule)、默認(rèn)值(Default)、約束(Constraint)和觸發(fā)器(Trigger)。2.約束的定義在SQLServer系統(tǒng)中,約束(Constraint)限制了用戶可能輸入到表或字段中的值。SQLServer的約束包括:DEFAULT、CHECK、UNIQUE、PRIMARYKEY和FOREIGNKEY約束,用戶應(yīng)該根據(jù)自己的需要,選擇使用哪個(gè)約束。約束可以是字段級(jí)約束,也可以是表級(jí)約束。字段級(jí)約束是把約束放在某個(gè)字段列上,且約束僅對(duì)該字段列l(wèi)l起作用;表級(jí)約束是把約束放在表中的多個(gè)字段列上。在SQLServer系統(tǒng)中,約束的定義主要是通過(guò)CREATETABLE語(yǔ)句或者ALTERTABLE語(yǔ)句來(lái)實(shí)現(xiàn)。使用CREATETABLE語(yǔ)句是在建立新表的同時(shí)定義了約束。使用ALTERTABLE語(yǔ)句是向已經(jīng)存在的表中添加約束。(1)使用CREATETABLE語(yǔ)句創(chuàng)建約束使用CREATETABLE語(yǔ)句創(chuàng)建表約束的語(yǔ)句格式如下:CREATETABLEtable_name(coumn_namedata_type〔DEFAULTconstant_expression〕〔<table_constraint>::=〔CONSTRAINTconstraint_name〕{〔NULL︱NOTNULL〕︱〔{PRIMARYKEY︱UNIQUE}〔CLUSTERED︱NONCLUSTERED〕〔WITHFILLFACTOR=fillfactor〕〔ON{filegroup︱DEFAULT}〕

〕 |〔FOREIGNKEY〕REFERENCESref_table〔(ref_column)〕 |CHECK〔NOTFORREPLICTION〕 }〕〔,…n〕 )

(2)使用ALTERTABLE語(yǔ)句添加約束 使用ALTERTABLE語(yǔ)句添加表約束的語(yǔ)句格式如下:ALTERTABLEtable{ADD{<column_constraint>〔CONSTRAINTconstraint_name〕 {〔NULL︱NOTNULL〕 |〔{PRIMARYKEY︱UNIQUE}〕 |〔FOREIGNKEY〕REFERENCESref_table〔(ref_column)〕 |DEFAULTconstant_expressionlll|CHECK(logical_expression)}}〔,…n〕|DROP{〔CONSTRAINT〕constraint_name︱COLUMNcolumn}〔,…n〕}使用ALTERTABLE添加約束時(shí),使用WITHNOCHECK選項(xiàng)可以實(shí)現(xiàn)對(duì)表中已有的數(shù)據(jù)不強(qiáng)制應(yīng)用約束(CHECK和FOREIGNKEY)。使用ALTERTABLE添加約束時(shí),使用NOCHECK選項(xiàng)可以實(shí)現(xiàn)禁止在修改和添加數(shù)據(jù)時(shí)應(yīng)用約束(CHECK和FOREIGHKEY)。刪除約束只能使用ALTERTABLE語(yǔ)句完成。3.PRIMARYKEY約束數(shù)據(jù)庫(kù)系統(tǒng)是通過(guò)主鍵來(lái)保證表的實(shí)體完整性。在關(guān)系數(shù)據(jù)庫(kù)中,表通常具有包含唯一標(biāo)識(shí)表中每一行的值的一列或多列,這樣的一列或多列,用于強(qiáng)制表的實(shí)體完整性,即主關(guān)鍵字。lll(1)PRIMARYKEY約束概述PRIMARYKEY約束通過(guò)創(chuàng)建唯一索引保證指定列的實(shí)體完整性,使用PRIMARYKEY約束時(shí),列的空值屬性必須定義為NOTNULL。PRIMARYKEY約束可以應(yīng)用于表中一列或多列。PRIMARYKEY約束反映了定義為主鍵的字段的取值不能重復(fù),并且不能取NULL值。創(chuàng)建PRIMARYKEY約束時(shí),SQLServer會(huì)自動(dòng)創(chuàng)建一個(gè)唯一的簇索引。實(shí)現(xiàn)PRIMARYKEY約束,應(yīng)考慮以下幾點(diǎn):每個(gè)表只能定義一個(gè)PRIMARYKEY約束。PRIMARYKEY約束只能放在定義為NOTNULL的字段上。如果表中已經(jīng)有了簇索引,那么在創(chuàng)建PRIMARYKEY約束之前,要么指定創(chuàng)建簇索引,要么刪除已有的簇索引。(2)使用SSMS管理PRIMARYKEY約束其具體操作步驟如下所述。①打開(kāi)SQLServerManagementStudio窗口,進(jìn)入新建表或修改表狀態(tài)。②右擊要設(shè)置PRIMARYKEY約束的列(例如:學(xué)號(hào)),選擇“設(shè)置主鍵”命令(也可以選擇工具欄上的按鈕),創(chuàng)建主鍵約束。

③創(chuàng)建主鍵約束后,在對(duì)應(yīng)的列名前有形如““的標(biāo)志,同時(shí)列的為空性也改變?yōu)椤安辉试S空”。 ④單擊“關(guān)閉”按鈕完成主鍵的創(chuàng)建。如果要?jiǎng)h除主鍵,右擊已經(jīng)創(chuàng)建主鍵的列,選擇“移除主鍵”命令。 (3)使用T-SQL創(chuàng)建PRIMARYKEY約束 定義PRIMARYKEY約束的基本語(yǔ)句格式如下所示。

CONSTRAINT約束名PRIMARYKEY(列或列的組合) 【案例7-1】學(xué)生信息表中需要以“學(xué)號(hào)”作為學(xué)生的唯一標(biāo)識(shí),在創(chuàng)建數(shù)據(jù)表學(xué)生信息時(shí),為學(xué)號(hào)設(shè)置PRIMARYKEY約束,語(yǔ)句如下所示,語(yǔ)句執(zhí)行后的效果如圖2-4-6所示。CREATETABLE學(xué)生信息(學(xué)號(hào)char(6)PRIMARYKEY,

姓名char(8),

性別char(2), ) 【案例7-2】學(xué)生信息表中需要以“學(xué)號(hào)”和“身份證號(hào)”作為學(xué)生的唯一標(biāo)識(shí),則在創(chuàng)建學(xué)生信息時(shí),為“學(xué)號(hào)”和“身份證號(hào)”的組合設(shè)置PRIMARYKEY約束,語(yǔ)句如下所示,語(yǔ)句執(zhí)行的效果如圖2-4-7所示。CREATETABLE學(xué)生信息(學(xué)號(hào)char(6),身份證號(hào)char(18),姓名char(8),性別char(2),CONSTRAINT)PK_學(xué)號(hào)_身份證號(hào)PRIMARYKEY(學(xué)號(hào),身份證號(hào))圖2-4-6創(chuàng)建“學(xué)號(hào)”主鍵圖2-4-7創(chuàng)建“學(xué)號(hào)”和“身份證號(hào)”主鍵組合4.FOREIGNKEY約束FOREIGNKEY約束為表中一列或多列數(shù)據(jù)提供引用完整性,它限制插入到表中被約束列的值必須在被引用表lllll中已經(jīng)存在。外鍵是說(shuō)明某列的取值必須參照另外表的主鍵值。一個(gè)外鍵既是一個(gè)表的主鍵,又是另一個(gè)表的外鍵。(1)FOREIGNKEY約束概述在創(chuàng)建表或更改表時(shí),可以通過(guò)定義FOREIGNKEY約束來(lái)定義外鍵。一旦FOREIGNKEY約束定義了某個(gè)字段,則該字段的取值必須參照同一個(gè)表或者另一個(gè)表中的PRIMARYKEY約束或UNQUE約束。在CREATETABLE或ALTERTABLE語(yǔ)句中,通過(guò)使用參照來(lái)聲明FOREIGNKEY約束。外鍵在關(guān)系數(shù)據(jù)庫(kù)中的意義:橋梁作用:外鍵提供了兩個(gè)表之間的連接。體現(xiàn)參照完整性:外鍵通過(guò)強(qiáng)制外鍵字段的取值必須是另外表中主鍵字段的有效性來(lái)實(shí)施參照完整性。(2)使用SSMS管理FOREIGNKEY約束【案例7-3】在“選課管理”數(shù)據(jù)庫(kù)中需要設(shè)置“成績(jī)”表中的“學(xué)號(hào)”作為外鍵,使用SQLServerManagementStudio管理FOREIGNKEY約束的具體操作步驟如下所述。打開(kāi)SQLServerManagementStudio窗口,進(jìn)入新建表或修改表狀態(tài)。右擊表的編輯區(qū)域,選擇“關(guān)系”命令。打開(kāi)“外鍵關(guān)系”對(duì)話框,單擊“添加”按鈕,如圖2-4-8所示。ll單擊“表和列規(guī)范”右邊的按鈕,打開(kāi)“表和列”對(duì)話框,分別選擇主鍵表和外鍵表以及列,如圖2-4-9

所示。單擊“確定”按鈕,再單擊“關(guān)閉”按鈕,完成“關(guān)系”的添加,一旦建立了表間的關(guān)系,也就建立了外 鍵。

圖2-4-8“外鍵關(guān)系”對(duì)話框(3)使用T-SQL創(chuàng)建FOREIGNKEY約束

FOREIGNKEY約束的定義格式如下所示。圖2-4-9“表和列”對(duì)話框

CONSTRAINT約束名FOREIGNKEY(列)REFERENCES被引用表(列)

【案例7-4】本例將參照“學(xué)生基本檔案”表和“課程信息”表創(chuàng)建“成績(jī)”表,“成績(jī)”表的主鍵是復(fù)合主鍵:“學(xué)號(hào)+課程號(hào)”語(yǔ)句如下所示,語(yǔ)句執(zhí)行的效果如圖2-4-10所示。圖2-4-10創(chuàng)建“成績(jī)”表CREATETABLE成績(jī)(學(xué)號(hào)char(9)NOTNULLCONSTRAINTPK_NUMFOREIGNKEY(學(xué)號(hào))REFERENCES學(xué)生基本檔案(學(xué)號(hào)),課程代號(hào)char(4)NOTNULLCONSTRAINTKEY_NUMFOREIGNKEY(課程代號(hào))REFERENCES課程信息(課程代號(hào)),

成績(jī)tinyint ) 5.DEFAULT約束

DEFAULT約束的作用就是當(dāng)用戶沒(méi)有為定義為DEFAULT約束的字段輸入數(shù)據(jù)時(shí),由DEFAULT約束提供默認(rèn)的數(shù)據(jù)。 (1)DEFAULT約束概述

DEFAULT定義是指表中添加新行時(shí)給表中某一列指定的默認(rèn)值。使用DEFAULT定義既可以避免NOTNULL值的數(shù)據(jù)錯(cuò)誤,又可以加快用戶的輸入速度。llll當(dāng)創(chuàng)建的默認(rèn)值對(duì)象綁定到列或用戶定義數(shù)據(jù)類(lèi)型時(shí),如果插入時(shí)沒(méi)有明確提供值,默認(rèn)值便指定一個(gè)值,并將其插入到對(duì)象所綁定的列中(或者,在用戶定義數(shù)據(jù)類(lèi)型的情況下,插入到所有列中)。因?yàn)槟J(rèn)值定義和表存儲(chǔ)在一起,當(dāng)除去表時(shí),將自動(dòng)除去默認(rèn)值定義。實(shí)現(xiàn)DEFAULT約束時(shí)應(yīng)注意:每一個(gè)字段只能有一個(gè)DEFAULT約束,同時(shí)DEFAULT約束不能放在IDENTITY字段上或者timestamp字段上。因?yàn)檫@兩個(gè)字段都能夠自動(dòng)插入數(shù)據(jù),因此,即使有DEFAULT約束也沒(méi)有什么意義。(2)使用SSMS管理DEFAULT定義【案例7-5】在“選課管理”數(shù)據(jù)庫(kù)中需要將“學(xué)生基本檔案”表中的“性別”的默認(rèn)值設(shè)置為“男”,使用SQLServerManagementStudio管理DEFAULT約束的具體操作步驟如下所述。打開(kāi)SQLServerManagementStudio程序,進(jìn)入新建表或修改表狀態(tài)。選擇要設(shè)置默認(rèn)值的列,在“列屬性”的“默認(rèn)值或綁定”選項(xiàng)中輸入默認(rèn)值為“男”,如圖2-4-11所示。設(shè)置默認(rèn)值后,向該表插入數(shù)據(jù)時(shí),如果不指定“性別”的值,其默認(rèn)值即為“男”,然后單擊“關(guān)閉”按鈕完成“DEFAULT定義”的設(shè)置。要?jiǎng)h除默認(rèn)值,可以在如圖2-4-11所示的表的設(shè)計(jì)界面中將指定列的默認(rèn)值取消即可。圖2-4-11設(shè)置“性別”默認(rèn)值為“男”(3)使用

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論