版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章管理數(shù)據(jù)表5.1數(shù)據(jù)表概述5.2SQLServer數(shù)據(jù)類型5.3在企業(yè)管理器中管理數(shù)據(jù)表5.4用Transact-SQL命令創(chuàng)建、修
改和刪除數(shù)據(jù)表結(jié)構(gòu)
5.5用Transact-SQL命令操作表中數(shù)據(jù)5.6數(shù)據(jù)的完整性與約束
5.7設(shè)計(jì)數(shù)據(jù)表5.8實(shí)戰(zhàn)訓(xùn)練小結(jié)
思考題
有了數(shù)據(jù)庫(kù),還不能存儲(chǔ)數(shù)據(jù),只有建好了數(shù)據(jù)表,才可以存儲(chǔ)數(shù)據(jù)。有了數(shù)據(jù)表,還要對(duì)其中的數(shù)據(jù)進(jìn)行管理,確保數(shù)據(jù)有效。本章任務(wù):認(rèn)識(shí)數(shù)據(jù)類型,學(xué)會(huì)創(chuàng)建數(shù)據(jù)表,管理表中數(shù)據(jù),驗(yàn)證數(shù)據(jù)完整性。5.1數(shù)?據(jù)?表?概?述數(shù)據(jù)表是存放數(shù)據(jù)的容器,是數(shù)據(jù)庫(kù)中最受關(guān)注的對(duì)象。5.1.1數(shù)據(jù)表的概念數(shù)據(jù)表是一種二維數(shù)據(jù)對(duì)象,由行和列組成,用于存儲(chǔ)關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù),是數(shù)據(jù)庫(kù)中最重要的對(duì)象。整個(gè)數(shù)據(jù)庫(kù)中的全部數(shù)據(jù)都存儲(chǔ)在各個(gè)數(shù)據(jù)表中。例如,某個(gè)教育數(shù)據(jù)庫(kù)具有一個(gè)教師表、一個(gè)學(xué)生表和一個(gè)課程表。
(1)數(shù)據(jù)表中的一列稱為一個(gè)字段(Field)。
(2)每個(gè)字段的標(biāo)題名稱稱為列名或字段名,如“姓名”就是該列的字段名,一個(gè)數(shù)據(jù)表中的字段名必須是唯一的。
(3)一個(gè)字段中存放同一類型的數(shù)據(jù),不同字段存放的數(shù)據(jù)類型可以不同。(4)一個(gè)字段中所存放的數(shù)據(jù)類型、數(shù)值大小及字段長(zhǎng)度等稱為該字段的屬性值。數(shù)據(jù)表中的一行稱為一條記錄,由表中各個(gè)字段的數(shù)據(jù)項(xiàng)組成,是一組相關(guān)數(shù)據(jù)的集合。例如,學(xué)生表中的一條記錄是一個(gè)學(xué)生相關(guān)數(shù)據(jù)的集合。每個(gè)表都有一個(gè)主鍵,主鍵字段的數(shù)據(jù)可以唯一標(biāo)識(shí)表中的一條記錄。例如,各個(gè)學(xué)生的編號(hào)是唯一的,可將“學(xué)號(hào)”字段指定為主鍵。設(shè)置了主鍵的數(shù)據(jù)表中,各條記錄是唯一的(即沒(méi)有完全相同的行)。
在數(shù)據(jù)庫(kù)中設(shè)計(jì)表的結(jié)構(gòu)就是告訴數(shù)據(jù)庫(kù)系統(tǒng)該表中各列的屬性,包括各列的列標(biāo)題(字段名稱)、每列中所要存放數(shù)據(jù)的類型(字段類型)、存放數(shù)據(jù)的大小或字符個(gè)數(shù)(字段長(zhǎng)度)以及其他說(shuō)明。在每個(gè)數(shù)據(jù)庫(kù)中都有系統(tǒng)表與用戶表。系統(tǒng)表是數(shù)據(jù)庫(kù)系統(tǒng)管理和存放系統(tǒng)中對(duì)象的容器,構(gòu)成SQLServer的系統(tǒng)目錄的內(nèi)置表。系統(tǒng)表存儲(chǔ)SQLServer實(shí)例的所有元數(shù)據(jù),包括實(shí)例的配置信息及其所有數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)對(duì)象的定義。用戶可以查看系統(tǒng)表,但不應(yīng)直接修改任何系統(tǒng)表。
下面簡(jiǎn)要介紹幾個(gè)最重要的系統(tǒng)表。有關(guān)系統(tǒng)表的詳細(xì)信息,可以查看SQLServer的聯(lián)機(jī)叢書(shū)。
(1)?Sysobjects表:SQLServer的主系統(tǒng)表,出現(xiàn)在每個(gè)數(shù)據(jù)庫(kù)中。它對(duì)每個(gè)數(shù)據(jù)庫(kù)對(duì)象都有一行記錄。
(2)?Syscolumns表:出現(xiàn)在master數(shù)據(jù)庫(kù)和每個(gè)用戶自定義的數(shù)據(jù)庫(kù)中,對(duì)基表或者視圖的每個(gè)列和存儲(chǔ)過(guò)程中的每個(gè)參數(shù)都有一行記錄。用戶表是用戶建立的用于存放數(shù)據(jù)的表,例如學(xué)生表、教師表、課程表等。5.1.2查看數(shù)據(jù)表對(duì)于數(shù)據(jù)庫(kù)中已經(jīng)建立的數(shù)據(jù)表,經(jīng)常需要查看其有關(guān)信息,比如表內(nèi)的數(shù)據(jù)、表的屬性、定義、字段屬性和索引等。尤其重要的是查看表內(nèi)存放的數(shù)據(jù),另外,有時(shí)也需要查看表與其他數(shù)據(jù)庫(kù)對(duì)象之間的依賴關(guān)系。
1.查看表的定義在企業(yè)管理器中,打開(kāi)指定的服務(wù)器和數(shù)據(jù)庫(kù),展開(kāi)表項(xiàng),并在右欄的窗口中右擊要查看的表,如圖5-1所示,然后從彈出的快捷菜單中選擇“屬性”選項(xiàng),將出現(xiàn)“表屬性”對(duì)話框,如圖5-2所示。在該對(duì)話框中,顯示該表的定義,如各個(gè)字段的名稱、類型、長(zhǎng)度等屬性。注意,該對(duì)話框中顯示的屬性不能修改。單擊“權(quán)限”按鈕,還可以查看和修改表的權(quán)限。圖5-1選擇表格屬性圖5-2“表屬性”對(duì)話框2.查看表中的數(shù)據(jù)在企業(yè)管理器中,打開(kāi)指定的數(shù)據(jù)庫(kù)并展開(kāi)表項(xiàng),在右欄的窗口中右擊要操作的表格,并從彈出的快捷菜單中選擇“打開(kāi)表”選項(xiàng)。該選項(xiàng)還有三個(gè)子選項(xiàng)(如圖5-3所示):“返回所有行”(用于顯示所有記錄)、“返回首行”(用于顯示表的前N條記錄,N可以自己輸入,如圖5-4所示)、“查詢”(用于查詢具體某行記錄)。這里右擊學(xué)生表,并依次選擇“打開(kāi)表”→“返回所有行”,將會(huì)出現(xiàn)顯示學(xué)生表中數(shù)據(jù)的對(duì)話框,如圖5-5所示。
3.查看表與其他數(shù)據(jù)庫(kù)對(duì)象的依賴關(guān)系在企業(yè)管理器中,右擊要查看的表格,從彈出的快捷菜單中選擇“所有任務(wù)”選項(xiàng),再?gòu)淖硬藛沃羞x擇“顯示相關(guān)性”選項(xiàng),將出現(xiàn)“相關(guān)性”對(duì)話框,如圖5-6所示。該對(duì)話框的左欄用于顯示依賴于此表格的對(duì)象,右欄用于顯示此表格依賴的對(duì)象。圖5-3選擇打開(kāi)表選項(xiàng)圖5-4輸入行數(shù)對(duì)話框圖5-5顯示表格數(shù)據(jù)對(duì)話框圖5-6“相關(guān)性”對(duì)話框4.利用系統(tǒng)存儲(chǔ)過(guò)程sp_help查看表的信息通過(guò)系統(tǒng)存儲(chǔ)過(guò)程sp_help可以獲得指定數(shù)據(jù)庫(kù)對(duì)象的信息,也可以獲得系統(tǒng)或者用戶定義的數(shù)據(jù)類型的信息。其語(yǔ)法形式如下:
sp_help[[@objname=]name]sp_help存儲(chǔ)過(guò)程只用于當(dāng)前的數(shù)據(jù)庫(kù),其中,[@objname=]name子句用于指定對(duì)象的名稱。如果不指定對(duì)象名稱,則sp_help存儲(chǔ)過(guò)程就會(huì)列出當(dāng)前數(shù)據(jù)庫(kù)中的所有對(duì)象名稱、對(duì)象的所有者和對(duì)象的類型?!纠?-1】顯示當(dāng)前數(shù)據(jù)庫(kù)中所有對(duì)象的信息。程序清單如下:
usecollegegoexecsp_help
命令運(yùn)行后如圖5-7所示。
【例5-2】顯示確定的學(xué)生表的信息。程序清單如下:
usecollegegoexecsp_help學(xué)生表運(yùn)行上述命令,將顯示學(xué)生表的類型、創(chuàng)建時(shí)間、字段名及其數(shù)據(jù)類型等信息。命令運(yùn)行后如圖5-8所示。圖5-7當(dāng)前數(shù)據(jù)庫(kù)中所有對(duì)象的信息圖5-8顯示學(xué)生表的相關(guān)信息5.2SQLServer數(shù)據(jù)類型數(shù)據(jù)表用來(lái)存儲(chǔ)數(shù)據(jù)。實(shí)際的數(shù)據(jù)千差萬(wàn)別,不同類型的數(shù)據(jù)代表了各種不同的信息類型,需要不同的存儲(chǔ)格式。SQLServer2000提供了豐富的數(shù)據(jù)類型,包括系統(tǒng)數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型。規(guī)定數(shù)據(jù)表字段的數(shù)據(jù)類型不僅可以避免大的錯(cuò)誤,而且還可以通過(guò)選擇合適的數(shù)據(jù)類型來(lái)充分利用表空間。5.2.1系統(tǒng)數(shù)據(jù)類型系統(tǒng)數(shù)據(jù)類型是SQLServer預(yù)先定義好的,可以直接使用。在實(shí)際使用中,SQLServer會(huì)自動(dòng)限制每個(gè)系統(tǒng)數(shù)據(jù)類型的值的范圍。當(dāng)插入數(shù)據(jù)表中的值超過(guò)了數(shù)據(jù)類型允許的范圍時(shí),SQLServer就會(huì)報(bào)錯(cuò)。SQLServer2000提供的系統(tǒng)數(shù)據(jù)類型有以下幾大類,共25種。1.整型數(shù)據(jù)類型整型數(shù)據(jù)類型是最常用的數(shù)據(jù)類型之一,它主要用來(lái)存儲(chǔ)整數(shù),可以直接進(jìn)行數(shù)據(jù)運(yùn)算,而不必使用函數(shù)轉(zhuǎn)換。
(1)?int(integer):每個(gè)int(或integer)數(shù)據(jù)類型值存儲(chǔ)在4個(gè)字節(jié)中,其中一個(gè)二進(jìn)制位表示整數(shù)值的正負(fù)號(hào),其他31個(gè)二進(jìn)制位表示整數(shù)值的長(zhǎng)度和大小。int數(shù)據(jù)類型可以存儲(chǔ)在-231(-2147483648)~231-1(2147483647)范圍之間的所有整數(shù)。
(2)?smallint:每個(gè)smallint類型的數(shù)據(jù)占用2個(gè)字節(jié)的存儲(chǔ)空間,其中一個(gè)二進(jìn)制位表示整數(shù)值的正負(fù)號(hào),其他15個(gè)二進(jìn)制位表示整數(shù)值的長(zhǎng)度和大小。smallint數(shù)據(jù)類型可以存儲(chǔ)在-215(-32768)~215-1(32767)范圍之間的所有整數(shù)。(3)?tinyint:每個(gè)tinyint類型的數(shù)據(jù)占用1個(gè)字節(jié)的存儲(chǔ)空間。Tinyint數(shù)據(jù)類型可以存儲(chǔ)在0~255范圍之間的所有整數(shù)。
2.浮點(diǎn)數(shù)據(jù)類型浮點(diǎn)數(shù)據(jù)類型用于存儲(chǔ)十進(jìn)制小數(shù)。浮點(diǎn)數(shù)值的數(shù)據(jù)在SQLServer中采用只入不舍的方式進(jìn)行存儲(chǔ),即當(dāng)(且僅當(dāng))要舍入的數(shù)是一個(gè)非零數(shù)時(shí),對(duì)其保留的數(shù)字部分的最低有效位上的數(shù)值加1,并進(jìn)行必要的進(jìn)位。
(1)?real:每個(gè)real類型的數(shù)據(jù)占用4個(gè)字節(jié)的存儲(chǔ)空間。real類型可以存儲(chǔ)正的或者負(fù)的十進(jìn)制數(shù)值,最大可以有7位精確位數(shù)。它的存儲(chǔ)范圍為-3.40E+38~3.40E+38。
(2)?float:可以精確到第15位小數(shù),其范圍為-1.79E-308~1.79E+308。如果不指定float數(shù)據(jù)類型的長(zhǎng)度,則它占用8個(gè)字節(jié)的存儲(chǔ)空間。float數(shù)據(jù)類型也可以寫(xiě)為float(n)的形式,n指定float數(shù)據(jù)的精度,n為1~15之間的整數(shù)值。當(dāng)n取1~7時(shí),實(shí)際是定義了一個(gè)real類型的數(shù)據(jù),系統(tǒng)用4個(gè)字節(jié)存儲(chǔ)它;當(dāng)n取8~15時(shí),系統(tǒng)認(rèn)為其是float類型,用8個(gè)字節(jié)存儲(chǔ)它。
(3)?decimal和numeric:decimal數(shù)據(jù)類型和numeric數(shù)據(jù)類型完全相同,分為兩種是為了保持與ANSI標(biāo)準(zhǔn)兼容。這兩種數(shù)據(jù)類型可以提供小數(shù)所需的實(shí)際存儲(chǔ)空間,可以用2~17個(gè)字節(jié)來(lái)存儲(chǔ)-1038-1~1038-1之間的數(shù)值。也可以將其寫(xiě)為decimal(p,s)的形式。其中,p表示可供存儲(chǔ)的數(shù)值的總位數(shù),默認(rèn)設(shè)置為18;s表示小數(shù)點(diǎn)后的位數(shù),默認(rèn)設(shè)置為0。注意:數(shù)值類型的總位數(shù)不包括小數(shù)點(diǎn)。例如,decimal(10,5),表示共有10位數(shù),其中整數(shù)5位,小數(shù)5位。3.字符數(shù)據(jù)類型字符數(shù)據(jù)類型也是SQLServer中最常用的數(shù)據(jù)類型之一,它可以用來(lái)存儲(chǔ)各種字母、數(shù)字符號(hào)和特殊符號(hào)。在使用字符數(shù)據(jù)類型時(shí),需要用英文單引號(hào)或者雙引號(hào)將其括起來(lái)。
(1)?char:當(dāng)用char數(shù)據(jù)類型存儲(chǔ)數(shù)據(jù)時(shí),每個(gè)字符和符號(hào)占用1個(gè)字節(jié)的存儲(chǔ)空間。其定義形式為:char(n)。其中,n表示所有字符所占的存儲(chǔ)空間,n的取值范圍為1~8000。若不指定n值,則系統(tǒng)默認(rèn)n的值為1。若輸入數(shù)據(jù)的字符串長(zhǎng)度小于n,則系統(tǒng)自動(dòng)在其后添加空格來(lái)填滿設(shè)定好的空間;若輸入的數(shù)據(jù)過(guò)長(zhǎng),則會(huì)截掉其超出部分。如果定義了一個(gè)char數(shù)據(jù)類型,而且允許該列為空,則該字段被當(dāng)作varchar來(lái)處理。(2)?varchar:用varchar數(shù)據(jù)類型可以存儲(chǔ)長(zhǎng)達(dá)8000個(gè)字符的可變長(zhǎng)度字符串。和char類型不同的是,varchar類型的存儲(chǔ)空間根據(jù)輸入數(shù)據(jù)的實(shí)際長(zhǎng)度而變化。其定義形式為:varchar(n)。例如,若定義varchar(20),則它對(duì)應(yīng)的字段最多可以存儲(chǔ)20個(gè)字符,如果數(shù)據(jù)的實(shí)際長(zhǎng)度不到20個(gè)字節(jié),則系統(tǒng)不會(huì)在其后添加空格,因此使用varchar類型可以節(jié)省空間。
(3)?nchar:nchar數(shù)據(jù)類型采用Unicode(統(tǒng)一字符編碼標(biāo)準(zhǔn))字符集。Unicode標(biāo)準(zhǔn)用于支持國(guó)際上的非英語(yǔ)語(yǔ)種。每個(gè)Unicode字符用兩個(gè)字節(jié)作為一個(gè)存儲(chǔ)單位,所以Unicode數(shù)據(jù)類型所占用的存儲(chǔ)空間是非Unicode數(shù)據(jù)類型的兩倍。其定義形式為:nchar(n)。其中,n表示所有字符所占的存儲(chǔ)空間,n的取值范圍為1~4000。(4)?nvarchar:nvarchar是使用Unicode字符集的varchar數(shù)據(jù)類型。其定義形式為:nvarchar(n)。其中,n表示所有字符所占的存儲(chǔ)空間,n的取值范圍為1~4000。
4.日期和時(shí)間數(shù)據(jù)類型
(1)?datetime:用于存儲(chǔ)日期和時(shí)間的結(jié)合體,它可以存儲(chǔ)在公元1753年1月1日零時(shí)到公元9999年12月31日23時(shí)59分59秒之間的所有日期和時(shí)間,其精確度可達(dá)1/300s,即3.33ms。datetime數(shù)據(jù)類型所占用的存儲(chǔ)空間為8個(gè)字節(jié),其中前4個(gè)字節(jié)用于存儲(chǔ)基于1900年1月1日之前或者之后的日期數(shù),數(shù)值分正負(fù),負(fù)數(shù)存儲(chǔ)的數(shù)值代表在基數(shù)日期之前的日期,正數(shù)表示在基數(shù)日期之后的日期,時(shí)間以子夜后的毫秒形式存儲(chǔ)在后面的4個(gè)字節(jié)中。(2)?smalldatetime:與datetime數(shù)據(jù)類型類似,但其日期時(shí)間范圍較小,它存儲(chǔ)在1900年1月1日到2079年6月6日之間的日期。smalldatetime數(shù)據(jù)類型使用4個(gè)字節(jié)存儲(chǔ)數(shù)據(jù),SQLServer2000用2個(gè)字節(jié)存儲(chǔ)日期1900年1月1日以后的天數(shù),時(shí)間以子夜后的分鐘數(shù)形式存儲(chǔ)在另外兩個(gè)字節(jié)中。smalldatetime的精度為1分鐘。
5.文本和圖形數(shù)據(jù)類型
(1)?text:用于存儲(chǔ)大容量文本數(shù)據(jù)。當(dāng)要存儲(chǔ)的字符型數(shù)據(jù)非常巨大,char和varchar已經(jīng)不能滿足其存儲(chǔ)要求(大于8000字符)時(shí),應(yīng)該選擇text數(shù)據(jù)類型。text數(shù)據(jù)類型的容量可以在1~231-1(2147483647)個(gè)字節(jié)范圍之內(nèi),但實(shí)際應(yīng)用時(shí)要根據(jù)硬盤(pán)的存儲(chǔ)空間而定。在定義text數(shù)據(jù)類型時(shí),不需要指定數(shù)據(jù)長(zhǎng)度,SQLServer會(huì)根據(jù)數(shù)據(jù)的長(zhǎng)度自動(dòng)為其分配空間。(2)?ntext:ntext數(shù)據(jù)類型采用Unicode標(biāo)準(zhǔn)字符集,用于存儲(chǔ)大容量文本數(shù)據(jù)。其理論上的容量為230-1(1073741823)個(gè)字節(jié)。
(3)?image:用于存儲(chǔ)照片、目錄圖片或者圖畫(huà),其理論容量為231-1(2?147?483?647)個(gè)字節(jié)。
6.貨幣數(shù)據(jù)類型
(1)?money:用于存儲(chǔ)貨幣值,money數(shù)據(jù)類型的數(shù)值以一個(gè)正數(shù)部分和—個(gè)小數(shù)部分存儲(chǔ)在兩個(gè)4字節(jié)的整型值中,存儲(chǔ)范圍為-922?337?213?685?477.5808~922?337?213?685?477.580?7,精度為貨幣單位的萬(wàn)分之一。
(2)?smallmoney:與money數(shù)據(jù)類型類似,但范圍比money數(shù)據(jù)類型小,其存儲(chǔ)范圍為-214748.3468~214748.3467。
當(dāng)為money或smallmoney的表輸入數(shù)據(jù)時(shí),必須在有效位置前面加一個(gè)貨幣單位符號(hào)(如$或其他貨幣單位的記號(hào))。
7.位數(shù)據(jù)類型
bit稱為位數(shù)據(jù)類型,其數(shù)據(jù)有兩種取值:0和1。SQLServer在存儲(chǔ)bit數(shù)據(jù)類型時(shí)做了優(yōu)化。當(dāng)一個(gè)表中有8個(gè)或更少的bit列時(shí),用1個(gè)字節(jié)存放;當(dāng)有9~16個(gè)bit列時(shí),用2個(gè)字節(jié)存放。在輸入0以外的其他值時(shí),系統(tǒng)均把它們當(dāng)1看待。這種數(shù)據(jù)類型常作為邏輯變量使用,用來(lái)表示真、假或是、否等二值選擇。8.二進(jìn)制數(shù)據(jù)類型
(1)?binary:其定義形式為binary(n),數(shù)據(jù)的存儲(chǔ)長(zhǎng)度是固定的,即n+4個(gè)字節(jié),當(dāng)輸入的二進(jìn)制數(shù)據(jù)長(zhǎng)度小于n時(shí),余下部分填充0。二進(jìn)制數(shù)據(jù)類型的最大長(zhǎng)度(即n的最大值)為8000,常用于存儲(chǔ)圖像等數(shù)據(jù)。
(2)?varbinary:其定義形式為varbinary(n),數(shù)據(jù)的存儲(chǔ)長(zhǎng)度是變化的,它是實(shí)際輸入數(shù)據(jù)的長(zhǎng)度加上4字節(jié)。其他含義同binary。在輸入二進(jìn)制常量時(shí),需在該常量前面加一個(gè)前綴0x,后面是十六進(jìn)制數(shù)。例如,二進(jìn)制數(shù)據(jù)1aa2bb3cc4共40位5個(gè)字節(jié),可表示為0x1aa2bb3cc4。9.特殊數(shù)據(jù)類型
(1)?timestamp:也稱做時(shí)間戳數(shù)據(jù)類型。timestamp是一種自動(dòng)記錄時(shí)間的數(shù)據(jù)類型,主要用于在數(shù)據(jù)表中記錄其數(shù)據(jù)的修改時(shí)間。它提供數(shù)據(jù)庫(kù)范圍內(nèi)的唯一值,反映數(shù)據(jù)庫(kù)中數(shù)據(jù)修改的相對(duì)順序,相當(dāng)于一個(gè)單調(diào)上升的計(jì)數(shù)器。當(dāng)用timestamp定義的列更新或者插入數(shù)據(jù)行時(shí),此列的值會(huì)被自動(dòng)更新,一個(gè)計(jì)數(shù)值將自動(dòng)添加到此timestamp數(shù)據(jù)列中。
(2)?uniqueidentifier:也稱做唯一標(biāo)識(shí)符數(shù)據(jù)類型。uniqueidentifier用于存儲(chǔ)一個(gè)16字節(jié)長(zhǎng)的二進(jìn)制數(shù)據(jù)類型,它是SQLServer根據(jù)計(jì)算機(jī)網(wǎng)絡(luò)適配器地址和CPU時(shí)鐘產(chǎn)生的全局唯一標(biāo)識(shí)符代碼(GloballyUniqueIDentifier,GUID),因此該數(shù)據(jù)類型可以保證全球范圍內(nèi)不同的計(jì)算機(jī)所產(chǎn)生的標(biāo)識(shí)符是唯一的。10.新增數(shù)據(jù)類型
SQLServer2000與SQLServer7相比,新增了3種數(shù)據(jù)類型:bigint、sql_variant和table。
(1)?bigint:用于存儲(chǔ)在-263(-9223372036854775807)~263-1(9223372036854775807)之間的所有整數(shù)。每個(gè)bigint類型的數(shù)據(jù)占用8個(gè)字節(jié)的存儲(chǔ)空間。
(2)?sql_variant:用于存儲(chǔ)除文本、圖形數(shù)據(jù)和timestamp類型數(shù)據(jù)外的其他任何合法的SQLServer數(shù)據(jù)。此數(shù)據(jù)類型極大地方便了SQLServer的開(kāi)發(fā)工作。
(3)?table:用于存儲(chǔ)對(duì)表或者視圖處理后的結(jié)果集。5.2.2用戶自定義數(shù)據(jù)類型
SQLServer允許用戶自定義數(shù)據(jù)類型。用戶自定義數(shù)據(jù)類型是建立在SQLServer系統(tǒng)數(shù)據(jù)類型基礎(chǔ)上的。當(dāng)用戶定義一種數(shù)據(jù)類型時(shí),需要指定該類型的名稱、建立在其上的系統(tǒng)數(shù)據(jù)類型以及是否允許為空等。SQLServer為用戶提供了兩種方法來(lái)創(chuàng)建自定義數(shù)據(jù)類型。1.使用企業(yè)管理器創(chuàng)建用戶自定義數(shù)據(jù)類型在企業(yè)管理器中,打開(kāi)指定的服務(wù)器和數(shù)據(jù)庫(kù)項(xiàng),選擇要?jiǎng)?chuàng)建用戶自定義數(shù)據(jù)類型的數(shù)據(jù)庫(kù),右擊該數(shù)據(jù)庫(kù),從彈出的快捷菜單中選擇“新建”命令中的“用戶定義的數(shù)據(jù)類型”選項(xiàng),出現(xiàn)“用戶定義的數(shù)據(jù)類型屬性”對(duì)話框,如圖5-9所示。在該對(duì)話框中,可以指定要定義的數(shù)據(jù)類型的名稱和要繼承的系統(tǒng)數(shù)據(jù)類型。對(duì)于某些數(shù)據(jù)類型,還可以選擇長(zhǎng)度以及設(shè)置是否允許為NULL值等屬性。最后,單擊“確定”按鈕,即可把用戶自定義的數(shù)據(jù)類型對(duì)象添加到指定的數(shù)據(jù)庫(kù)中。圖5-9“用戶定義的數(shù)據(jù)類型屬性”對(duì)話框2.使用系統(tǒng)存儲(chǔ)過(guò)程創(chuàng)建用戶自定義數(shù)據(jù)類型系統(tǒng)存儲(chǔ)過(guò)程sp_addtype為用戶提供了用Transact-SQL語(yǔ)句創(chuàng)建自定義數(shù)據(jù)類型的途徑。其語(yǔ)法形式如下:
sp_addtype[@typename=]type,
[@phystype=]system_data_type[,[@nulltype=]'null_type'][,[@owner=]'owner_name']
命令中各參數(shù)的說(shuō)明如下:●?type:指定用戶定義的數(shù)據(jù)類型的名稱?!?system_data_type:指定相應(yīng)的系統(tǒng)提供的數(shù)據(jù)類型的名稱及定義。注意:不能使用timestamp數(shù)據(jù)類型,當(dāng)對(duì)所使用系統(tǒng)的數(shù)據(jù)類型有額外說(shuō)明時(shí),需要用單引號(hào)將其括起來(lái),例如'varchar(80)'。●null_type:?指定用戶自定義數(shù)據(jù)類型的NULL屬性,其值可以為NULL、NOTNULL或者NONULL。默認(rèn)時(shí),null_type與系統(tǒng)默認(rèn)的NULL屬性相同。●owner_name:指定用戶自定義數(shù)據(jù)類型的所有者。用戶自定義數(shù)據(jù)類型的名稱在數(shù)據(jù)庫(kù)中應(yīng)該是唯一的,但不同名稱的用戶自定義數(shù)據(jù)類型可以有相同的類型定義。
【例5-3】在pubs數(shù)據(jù)庫(kù)中自定義一個(gè)地址(address)數(shù)據(jù)類型。 程序清單如下:
usepubsgoexecsp_addtypeaddress,'varchar(60)'
其運(yùn)行結(jié)果如下:
(所影響的行數(shù)為1行)
類型已添加。同樣,刪除用戶自定義數(shù)據(jù)類型的方法也有兩種,即利用企業(yè)管理器和系統(tǒng)存儲(chǔ)過(guò)程sp_droptype。
在企業(yè)管理器中,右擊用戶自定義的數(shù)據(jù)類型,從彈出的快捷菜單中選擇“刪除”選項(xiàng),就會(huì)出現(xiàn)“除去對(duì)象”對(duì)話框,如圖5-10所示。在該對(duì)話框中可以單擊“顯示相關(guān)性”按鈕查看數(shù)據(jù)庫(kù)內(nèi)是否有對(duì)象依賴此數(shù)據(jù)類型,如果沒(méi)有,則可以單擊“全部除去”按鈕刪除該數(shù)據(jù)類型。使用系統(tǒng)存儲(chǔ)過(guò)程sp_droptype刪除自定義數(shù)據(jù)類型的語(yǔ)法如下:
sp_droptype[@typename=]'type'圖5-10“除去對(duì)象”對(duì)話框
【例5-4】在pubs數(shù)據(jù)庫(kù)中刪除自定義的地址(address)數(shù)據(jù)類型。程序清單如下:
usepubsgoexecsp_droptypeaddress
其運(yùn)行結(jié)果如下:
(所影響的行數(shù)為1行)(所影響的行數(shù)為0行)
類型已除去。5.3在企業(yè)管理器中管理數(shù)據(jù)表5.3.1新建數(shù)據(jù)表結(jié)構(gòu)在SQLServer2000中,每個(gè)數(shù)據(jù)庫(kù)里最多可以有20億個(gè)表。每個(gè)表最多可以設(shè)置1024個(gè)字段(列)。每條記錄最多占8060個(gè)字節(jié),不包括text、ntext和image字段。在企業(yè)管理器中創(chuàng)建college數(shù)據(jù)庫(kù)的“學(xué)生表”的步驟如下所述。
1.打開(kāi)“表設(shè)計(jì)器”窗口打開(kāi)企業(yè)管理器,展開(kāi)企業(yè)管理器控制臺(tái)根目錄,找到college數(shù)據(jù)庫(kù),右擊該數(shù)據(jù)庫(kù)中的表節(jié)點(diǎn),在快捷菜單中單擊“新建表”命令,隨即打開(kāi)“表設(shè)計(jì)器”窗口。2.輸入相關(guān)字段
(1)表設(shè)計(jì)器上半部分的表格用于描述表的結(jié)構(gòu),設(shè)計(jì)器表格的每一行描述數(shù)據(jù)表的一個(gè)字段,四列參數(shù)分別描述該字段的“列名”、“數(shù)據(jù)類型”、“長(zhǎng)度”和“允許空”?!窳忻?字段名):同一表中的字段名必須唯一。列名可以由字母、漢字、數(shù)字和下劃線組成,不能以數(shù)字開(kāi)頭,不能是關(guān)鍵字,長(zhǎng)度不超過(guò)128個(gè)字符?!駭?shù)據(jù)類型:是一個(gè)下拉列表框,其中包括了當(dāng)前數(shù)據(jù)庫(kù)的全部類型,也包括用戶自定義的數(shù)據(jù)類型,可直接從中選擇。●長(zhǎng)度:對(duì)需要設(shè)置數(shù)據(jù)類型長(zhǎng)度的字段輸入長(zhǎng)度值。對(duì)于默認(rèn)長(zhǎng)度的類型,系統(tǒng)自動(dòng)取固定長(zhǎng)度,不允許用戶設(shè)置。●允許空:用“√”表示允許為空值,取消“√”表示不允許為空值。默認(rèn)狀態(tài)為“√”,即允許為空,單擊鼠標(biāo)可以切換。(2)“表設(shè)計(jì)器”下半部分用來(lái)描述字段的附加屬性。當(dāng)鼠標(biāo)選中哪個(gè)字段(標(biāo)志塊中有三角標(biāo)志)時(shí),即可為該字段設(shè)置附加屬性?!衩枋觯狠斎朐撟侄蔚恼f(shuō)明性文字?!衲J(rèn)值:當(dāng)輸入記錄時(shí),如果該字段沒(méi)有輸入數(shù)據(jù),則自動(dòng)使用該默認(rèn)值。默認(rèn)值可以在此直接輸入,也可事先單獨(dú)設(shè)置默認(rèn)約束對(duì)象,在這個(gè)下拉列表中選取已定義好的默認(rèn)值約束對(duì)象?!窬取⑿?shù)位數(shù):對(duì)numeric(p,s)和decimal(p,s)類型,需在此處設(shè)置精度p和小數(shù)位數(shù)s的值?!駱?biāo)識(shí)(是/否):選擇是否將該字段設(shè)置為自動(dòng)編號(hào)字段(identity,輸入記錄時(shí)系統(tǒng)根據(jù)“標(biāo)識(shí)種子”和“遞增量”自動(dòng)產(chǎn)生該字段的值)。只有bigint、int、smallint等整數(shù)類型的字段在清除了“允許空”的“√”后才可以設(shè)置為該項(xiàng)?!駱?biāo)識(shí)種子(初始值):為數(shù)據(jù)表第一條記錄的自動(dòng)編號(hào)設(shè)置初始值,只有“標(biāo)識(shí)”設(shè)為“是”才允許設(shè)置該項(xiàng)。例如,要給學(xué)生表加一個(gè)“序號(hào)”字段,并設(shè)為自動(dòng)編號(hào),若第一個(gè)學(xué)生的序號(hào)是10001,則可將該值設(shè)置為“標(biāo)識(shí)種子”?!駱?biāo)識(shí)遞增量:設(shè)置自動(dòng)編號(hào)字段每增加一條記錄時(shí)編號(hào)的增長(zhǎng)量。標(biāo)識(shí)遞增量默認(rèn)為1。3.保存空數(shù)據(jù)表“學(xué)生表”結(jié)構(gòu)輸入完畢后必須進(jìn)行保存,單擊文件菜單的“保存”或工具欄中的“保存”按鈕,在彈出的“選擇名稱對(duì)話框”中輸入表名“學(xué)生表”(默認(rèn)為T(mén)ABLE1),單擊“確定”關(guān)閉表設(shè)計(jì)器,“學(xué)生表”的結(jié)構(gòu)即設(shè)計(jì)創(chuàng)建完成,此時(shí)在數(shù)據(jù)庫(kù)中創(chuàng)建了一個(gè)沒(méi)有數(shù)據(jù)的空“學(xué)生表”。5.3.2修改數(shù)據(jù)表結(jié)構(gòu)若沒(méi)有關(guān)閉“表設(shè)計(jì)器”,則可直接在設(shè)計(jì)器中反復(fù)設(shè)置和修改各個(gè)字段,為各個(gè)字段設(shè)置約束。若已經(jīng)關(guān)閉(創(chuàng)建完成),則可隨時(shí)再打開(kāi)要修改表的“表設(shè)計(jì)器”,對(duì)表結(jié)構(gòu)進(jìn)行修改并設(shè)置各種約束,也可以使用SQL語(yǔ)句修改表的結(jié)構(gòu)和創(chuàng)建約束。1.打開(kāi)已有表的“表設(shè)計(jì)器”打開(kāi)企業(yè)管理器,依次展開(kāi)要修改的數(shù)據(jù)庫(kù),單擊“表”對(duì)象展開(kāi)數(shù)據(jù)表,選擇要修改的數(shù)據(jù)表,右鍵單擊,在彈出的快捷菜單中選擇“設(shè)計(jì)表”命令,即可打開(kāi)該表的“表設(shè)計(jì)器”。
2.修改字段屬性在設(shè)計(jì)器中可以自由地修改各字段的“列名”、“數(shù)據(jù)類型”、“字段長(zhǎng)度”、“允許空”以及其他附加屬性。
3.添加新字段如果在最后追加一個(gè)新字段,則將光標(biāo)移到(或用鼠標(biāo)單擊)最下面的空白行中,即可輸入一個(gè)定義新字段的新行。如果要在某個(gè)字段前插入一個(gè)新字段,則右擊插入位置的字段,在彈出的快捷菜單中選擇“插入列”,將會(huì)在該列之前出現(xiàn)一行空白,即可插入一個(gè)字段。4.刪除字段右擊要?jiǎng)h除的字段,在彈出的快捷菜單中選擇“刪除列”命令即可刪除該字段。
5.移動(dòng)字段順序單擊要移動(dòng)字段左方(最前端)的標(biāo)志塊,出現(xiàn)一個(gè)“三角”標(biāo)志,左鍵按下不松開(kāi),然后拖動(dòng)該字段到所需要的位置再松開(kāi)即可。
6.修改字段約束右擊要修改約束的字段,在彈出的快捷菜單中選擇“屬性”,即可在彈出的“屬性”對(duì)話框中設(shè)置或修改該字段的約束,具體方法將在5.6節(jié)介紹。
7.關(guān)閉“表設(shè)計(jì)器”修改完畢,單擊“保存”工具按鈕,保存修改后的表結(jié)構(gòu)并關(guān)閉“表設(shè)計(jì)器”。5.3.3管理數(shù)據(jù)表數(shù)據(jù)
(1)在企業(yè)管理器中,打開(kāi)指定的數(shù)據(jù)庫(kù)并展開(kāi)表格項(xiàng),在右欄的窗口中右擊要操作的表格,并從彈出的快捷菜單中選擇“打開(kāi)表”選項(xiàng),選擇“返回所有行”,如圖5-11所示。
(2)在表末添加新數(shù)據(jù),如圖5-12所示。
(3)選擇表中已存在的數(shù)據(jù)進(jìn)行修改,如圖5-13所示。
(4)選擇表中已存在的數(shù)據(jù)進(jìn)行刪除,如圖5-14所示。圖5-11學(xué)生表信息圖5-12添加新數(shù)據(jù)后的學(xué)生表信息圖5-13修改后的學(xué)生表信息圖5-14刪除后的學(xué)生表信息5.4用Transact-SQL命令創(chuàng)建、修改和刪除數(shù)據(jù)表結(jié)構(gòu)5.4.1創(chuàng)建數(shù)據(jù)表結(jié)構(gòu)
1.利用Transact-SQL語(yǔ)言創(chuàng)建表使用CREATE命令創(chuàng)建表非常靈活,它允許對(duì)表設(shè)置幾種不同的選項(xiàng),包括表名、存放位置和列的屬性等。其語(yǔ)法形式如下:
CREATETABLE
[database_name.[owner].|owner.]table_name
{<column_definition>
|column_nameAScomputed_column_expression
|<table_constraint>::=[CONSTRAINTconstraint_name]}|[{PRIMARYKEY|UNIQUE}[,...n]
][ON{filegroup|DEFAULT}]
[TEXTIMAGE_ON{filegroup|DEFAULT}]<column_definition>::={column_namedata_type}
[COLLATE<collation_name>]
[[DEFAULTconstant_expression]
|[IDENTITY[(seed,increment)[NOTFORREPLICATION]]]
]
[ROWGUIDCOL]
[<column_constraint>][,...n]
<column_constraint>::=[CONSTRAINTconstraint_name]
{[NULL|NOTNULL]
|[{PRIMARYKEY|UNIQUE}
[CLUSTERED|NONCLUSTERED]
[WITHFILLFACTOR=fillfactor]
[ON{filegroup|DEFAULT}]]
}|[[FOREIGNKEY]
REFERENCESref_table[(ref_column)]
[ONDELETE{CASCADE|NOACTION}]
[ONUPDATE{CASCADE|NOACTION}]
[NOTFORREPLICATION]
]
|CHECK[NOTFORREPLICATION]
(logical_expression)
<table_constraint>::=[CONSTRAINTconstraint_name]
{[{PRIMARYKEY|UNIQUE}
[CLUSTERED|NONCLUSTERED]
{(column[ASC|DESC][,...n])}
[WITHFILLFACTOR=fillfactor]
[ON{filegroup|DEFAULT}]]
|FOREIGNKEY
[(column[,...n])]
REFERENCESref_table[(ref_column[,...n])]
[ONDELETE{CASCADE|NOACTION}]
[ONUPDATE{CASCADE|NOACTION}]
[NOTFORREPLICATION]
|CHECK[NOTFORREPLICATION]
(search_conditions)
}其中,各參數(shù)的說(shuō)明如下:●?database_name:用于指定所創(chuàng)建表的數(shù)據(jù)庫(kù)名稱。database_name必須是現(xiàn)有數(shù)據(jù)庫(kù)的名稱。如果不指定數(shù)據(jù)庫(kù),則database_name默認(rèn)為當(dāng)前數(shù)據(jù)庫(kù)?!?owner:用于指定新建表的所有者的用戶名。owner必須是database_name所指定的數(shù)據(jù)庫(kù)中的現(xiàn)有用戶名。owner默認(rèn)為當(dāng)前注冊(cè)用戶名。●?table_name:用于指定新建表的名稱。表名必須符合標(biāo)識(shí)符規(guī)則。對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),database_name、owner_name、object_name必須是唯一的。表名最多不能超過(guò)128個(gè)字符。●?column_name:用于指定新建表的列名?!?computed_column_expression:用于指定計(jì)算列的列值表達(dá)式。●ON{filegroup|DEFAULT}:用于指定存儲(chǔ)表的文件組名。如果指定filegroup,則表將存儲(chǔ)在指定的文件組中。數(shù)據(jù)庫(kù)中必須存在該文件組。如果使用了DEFAULT選項(xiàng),或者省略了ON子句,則新建的表會(huì)存儲(chǔ)在默認(rèn)的文件組中?!?TEXTIMAGE_ON:用于指定text、ntext和image列的數(shù)據(jù)存儲(chǔ)的文件組。如果表中沒(méi)有text、ntext或image列,則不能使用TEXTIMAGE_ON。如果沒(méi)有指定TEXTIMAGE_ON子句,則text、ntext和image列的數(shù)據(jù)將與表存儲(chǔ)在相同的文件組中。●?data_type:用于指定列的數(shù)據(jù)類型。●?DEFAULT:用于指定列的默認(rèn)值?!?constant_expression:用于指定列的默認(rèn)值的常量表達(dá)式,可以為一個(gè)常量、NULL或系統(tǒng)函數(shù)。●?IDENTITY:用于將列指定為標(biāo)識(shí)列。●?seed:用于指定標(biāo)識(shí)列的初始值?!?increment:用于指定標(biāo)識(shí)列的增量值?!馧OTFORREPLICATION:用于指定列的IDENTITY屬性,當(dāng)把從其他表中復(fù)制的數(shù)據(jù)插入到表中時(shí)不發(fā)生作用,即不生成列值,使得復(fù)制的數(shù)據(jù)行保持原來(lái)的列值?!?ROWGUIDCOL:用于將列指定為全局唯一標(biāo)識(shí)符列?!?COLLATE:用于指定排序規(guī)則?!?column_constraint和table_constraint:用于指定列約束和表約束。
【例5-5】在college數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)學(xué)生表,在該數(shù)據(jù)表中,還定義了“性別”字段的默認(rèn)值為“男”。創(chuàng)建該數(shù)據(jù)表的具體操作步驟如下:
(1)單擊“開(kāi)始”→“程序”→“MicrosoftSQLServer”→“查詢分析器”,打開(kāi)查詢分析器。(2)在查詢分析器的查詢窗口中輸入如下代碼:
--打開(kāi)數(shù)據(jù)庫(kù)
USEcollegeGO--創(chuàng)建數(shù)據(jù)表
CREATETABLE學(xué)生表
--定義“學(xué)號(hào)”不可為空
(學(xué)號(hào)intnotnull,
--定義“身份證”不可為空身份證char(18)NOTNULL,班級(jí)編號(hào)varchar(25),
--定義“姓名”列不可為空姓名varchar(8)NOTNULL,
性別char(2)NOTNULLdefault'男',出生年月smalldatetime,電話varchar(50),地址varchar(50))(3)執(zhí)行該代碼。
(4)單擊“開(kāi)始”→“程序”→“MicrosoftSQLServer”→“企業(yè)管理器”,打開(kāi)企業(yè)管理器。
(5)展開(kāi)相應(yīng)的服務(wù)器和數(shù)據(jù)庫(kù),展開(kāi)數(shù)據(jù)庫(kù)college和表文件夾,從詳細(xì)列表中右擊數(shù)據(jù)表(即“學(xué)生表”),從快捷菜單中選擇“屬性”,此時(shí)將顯示如圖5-15所示的“表屬性”窗口。圖5-15“表屬性”窗口【例5-6】在數(shù)據(jù)庫(kù)college中創(chuàng)建一個(gè)課程表,表中各列的要求如表5-1所示。程序清單如下:
USEcollegeGOCREATETABLE課程表
(
課程號(hào)char(8)notnull,課程名稱varchar(20)notnull,課時(shí)tinyint,學(xué)分tinyint,備注varchar(50))GO表5-1課程表的建表要求5.4.2修改數(shù)據(jù)表結(jié)構(gòu)修改數(shù)據(jù)表要使用的語(yǔ)句是ALTERTABLE。使用該語(yǔ)句修改數(shù)據(jù)表的語(yǔ)法如下:
ALTERTABLEtable{[ALTERCOLUMNcolumn_name{new_data_type[(precision[,scale])][COLLATE<collation_name>][NULL|NOTNULL]|{ADD|DROP}ROWGUIDCOL}
]|ADD
{[<column_definition>]|column_nameAScomputed_column_expression
}[,...n]|[WITHCHECK|WITHNOCHECK]ADD
{<table_constraint>}[,...n]|DROP
{[CONSTRAINT]constraint_name
|COLUMNcolumn}[,...n]|{CHECK|NOCHECK}CONSTRAINT{ALL|constraint_name[,...n]}|{ENABLE|BISABLE}TRIGGER{ALL|trigger_name[,…n]}其中,各部分代碼的具體功能如下:●?ALTERCOLUMN:用于修改數(shù)據(jù)表中字段的定義。●?ADD{[column_definition]|[column_nameAScomputed_column_expression]}:用于添加字段?!?<table_constraint:用于添加約束?!?DROPCOLUMNcolumn_name[,…n]:用于刪除字段?!?DROPCONSTRAINTconstraint_name[,...n]:用于刪除約束。在使用這些代碼時(shí),需要將下列參數(shù)替換為相應(yīng)的內(nèi)容,如表5-2所示。表5-2參數(shù)說(shuō)明5.4.3刪除數(shù)據(jù)表結(jié)構(gòu)刪除數(shù)據(jù)表使用DROPTABLE語(yǔ)句,其語(yǔ)法形式如下:
DROPTABLEtable[,…n]其中,table需要替換為要?jiǎng)h除的數(shù)據(jù)表名稱。利用下的語(yǔ)句我們可以刪除5.4.1節(jié)建立的學(xué)生表:
DROPTABLE學(xué)生表5.5用Transact-SQL命令操作表中數(shù)據(jù)5.5.1添加數(shù)據(jù)
INSERT語(yǔ)句用于向數(shù)據(jù)庫(kù)表或者視圖中加入一行數(shù)據(jù)。INSERT語(yǔ)句的基本語(yǔ)法格式如下:
INSERT[INTO]{table_name|view_name}[(column_list)]{VALUES({DEFAULT|NULL|expression}[,...n])|derived_table}
其中,各參數(shù)的說(shuō)明如下:●?INTO:一個(gè)可選的關(guān)鍵字,使用這個(gè)關(guān)鍵字可以使語(yǔ)句的意義清晰?!?table_name:要插入數(shù)據(jù)的表名稱?!?view_name:要插入數(shù)據(jù)的視圖名稱。●?column_list:要插入數(shù)據(jù)的一列或多列的列表,說(shuō)明INSERT語(yǔ)句只為指定的列插入數(shù)據(jù)。其他沒(méi)指定列的取值情況如下:如果該列具有IDENTITY屬性,則使用下一個(gè)增量標(biāo)識(shí)值;如果該列具有默認(rèn)值,則使用列的默認(rèn)值;如果該列具有timestamp數(shù)據(jù)類型,則使用當(dāng)前的時(shí)間戳值;如果該列允許為空,則使用空值。column_list的內(nèi)容必須用圓括號(hào)括起來(lái),并且用逗號(hào)進(jìn)行分隔?!?VALUES:插入的數(shù)據(jù)值的列表。注意:必須用圓括號(hào)將值列表括起來(lái),并且數(shù)值的順序和類型要與column_list中的數(shù)據(jù)相對(duì)應(yīng)?!?DEFAULT:使用默認(rèn)值填充?!?NULL:使用空值填充?!?expression:常量、變量或表達(dá)式。表達(dá)式不能包含SELECT或EXECUTE語(yǔ)句。●?derived_table:任何有效的SELECT語(yǔ)句,它返回后將插入到表中的數(shù)據(jù)行。
【例5-7】利用INSERT語(yǔ)句向課程表中插入一些數(shù)據(jù)行,這些行只有部分列包含值。
程序清單如下:
USEcollegeGO--無(wú)省略插入語(yǔ)句
INSERTINTO課程表
(課程號(hào),課程名稱,課時(shí),學(xué)分)VALUES('059001','C語(yǔ)言',100,5)--部分省略插入語(yǔ)句
INSERT課程表VALUES('059002','高等數(shù)學(xué)',80,3)--多記錄插入語(yǔ)句
INSERTINTO課程表(課程號(hào),課程名稱)SELECT課程號(hào),課程名稱FROM課程表25.5.2修改數(shù)據(jù)
UPDATE語(yǔ)句用于修改數(shù)據(jù)庫(kù)表中特定記錄或者字段的值。其基本語(yǔ)法格式如下:
UPDATE{table_name|view_name}SETcolumn_name={expression|DEFAULT|NULL}[,…n][WHERE<search_condition>]
【例5-8】一個(gè)帶有WHERE條件的修改語(yǔ)句。程序清單如下:
USEcollegeGOUPDATE課程表
SET課程號(hào)='059004',課時(shí)='120'WHERE課程名稱='C語(yǔ)言'【例5-9】一個(gè)簡(jiǎn)單的修改語(yǔ)句。程序清單如下:
USEcollegeGOUPDATE課程表
SET課程號(hào)='059005',課時(shí)='120'
說(shuō)明:如果沒(méi)有WHERE子句,則UPDATE將會(huì)修改表中所有行的數(shù)據(jù)。5.5.3使用DELETE語(yǔ)句刪除數(shù)據(jù)
DELETE語(yǔ)句用于刪除數(shù)據(jù)庫(kù)表中的數(shù)據(jù)。其基本語(yǔ)法格式如下:
DELETE[FROM]{table_name|view_name}[WHERE<search_condition>]【例5-10】一個(gè)簡(jiǎn)單的刪除語(yǔ)句,從學(xué)生表中刪除姓名為“王安”的學(xué)生。程序清單如下:
USEcollegeGODELETEFROM學(xué)生表
WHERE姓名='王安'【例5-11】一個(gè)沒(méi)有WHERE條件的刪除語(yǔ)句,刪除學(xué)生表的全部記錄。程序清單如下:
USEcollegeGODELETEFROM學(xué)生表說(shuō)明:當(dāng)不指定WHERE子句時(shí),將刪除表中所有行的數(shù)據(jù)。5.5.4使用TRUNCATE語(yǔ)句刪除數(shù)據(jù)要清除表中的所有數(shù)據(jù),而只留下表格的定義,還可以使用TRUNCATE語(yǔ)句。與DELETE語(yǔ)句相比,TRUNCATE通常速度更快,因?yàn)門(mén)RUNCATE是不記錄日志的操作。其語(yǔ)句格式為:TRUNCATEtable_name【例5-12】使用TRUNCATE語(yǔ)句清空學(xué)生表中的數(shù)據(jù)。程序清單如下:
USEcollegeGOTRUNCATE學(xué)生表5.6數(shù)據(jù)的完整性與約束5.6.1完整性的概念數(shù)據(jù)完整性就是指存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)正確無(wú)誤并且相關(guān)數(shù)據(jù)具有一致性。數(shù)據(jù)庫(kù)中是否存在完整的數(shù)據(jù),關(guān)系到數(shù)據(jù)庫(kù)系統(tǒng)能否真實(shí)地反映現(xiàn)實(shí)世界。例如,在“學(xué)生”表中學(xué)生的學(xué)號(hào)要具有唯一性,其性別只能是男或女,其所在系部、專業(yè)、班級(jí)必須是存在的,否則就會(huì)出現(xiàn)數(shù)據(jù)庫(kù)中的數(shù)據(jù)與現(xiàn)實(shí)不符的現(xiàn)象。如果數(shù)據(jù)庫(kù)中總存在不完整的數(shù)據(jù),那么它就沒(méi)有存在的必要了,因此實(shí)現(xiàn)數(shù)據(jù)的完整性在數(shù)據(jù)庫(kù)管理系統(tǒng)中十分重要。
根據(jù)數(shù)據(jù)完整性機(jī)制所作用的數(shù)據(jù)庫(kù)對(duì)象和范圍的不同,數(shù)據(jù)完整性可分為實(shí)體完整性、域完整性、參照完整性和用戶定義的完整性4種類型。
1.實(shí)體完整性這里的實(shí)體是指表中的記錄,一個(gè)實(shí)體就是表中的一條記錄。實(shí)體完整性要求在表中不能存在完全相同的記錄,而且每條記錄都要具有一個(gè)非空且不重復(fù)的主鍵值。這樣就可以保證數(shù)據(jù)所代表的任何事物都不存在重復(fù),可以區(qū)分。例如,“學(xué)生”表中的學(xué)號(hào)必須唯一,并且不能為空,這樣就可以保證學(xué)生記錄的唯一性。實(shí)現(xiàn)實(shí)體完整性的方法主要有主鍵約束、唯一約束和指定IDENTITY屬性等。2.域完整性域完整性也可稱為列完整性。域完整性要求向表中指定列輸入的數(shù)據(jù)必須具有正確的數(shù)據(jù)類型、格式以及有效的數(shù)據(jù)范圍。例如,在“成績(jī)”表中,對(duì)學(xué)生成績(jī)列輸入數(shù)據(jù)時(shí),不能出現(xiàn)字符,也不能輸入小于0或大于100的數(shù)值。實(shí)現(xiàn)域完整性的方法主要有CHECK約束、默認(rèn)約束、非空定義、規(guī)則以及在建表時(shí)設(shè)置數(shù)據(jù)類型。3.參照完整性參照完整性又稱為引用完整性。參照完整性是指作用于有關(guān)聯(lián)的兩個(gè)或兩個(gè)以上的表,通過(guò)使用主鍵和外鍵或主鍵和唯一鍵之間的關(guān)系,使表中的鍵值在相關(guān)表中保持一致。例如,在“學(xué)生”表中的“班級(jí)編號(hào)”列的值必須是在“班級(jí)”表的“班級(jí)編號(hào)”列中存在的值,以防止在錄入學(xué)生記錄時(shí)將學(xué)生分配到一個(gè)不存在的班級(jí)中。又如,在成績(jī)表中的“學(xué)號(hào)”列不能輸入學(xué)生表中沒(méi)有的“學(xué)號(hào)”,以防止將成績(jī)記錄給不存在的學(xué)生。實(shí)現(xiàn)參照完整性的方法主要是外鍵約束。4.用戶定義的完整性用戶定義的完整性是應(yīng)用領(lǐng)域需要遵守的約束條件,允許用戶定義不屬于其他任何完整性分類的特定業(yè)務(wù)規(guī)則。所有的完整性類型都支持用戶定義的完整性。約束是SQLServer提供的自動(dòng)保持?jǐn)?shù)據(jù)庫(kù)完整性的一種方法,它通過(guò)限制字段中數(shù)據(jù)、記錄中數(shù)據(jù)和表之間的數(shù)據(jù)來(lái)保證數(shù)據(jù)的完整性。在SQLServer2000中,約束有主鍵約束(PrimaryKeyConstraint)、唯一性約束(UniqueConstraint)、檢查約束(CheckConstraint)、默認(rèn)約束(DefaultConstraint)、外鍵約束(ForeignKeyConstraint)、非空和自動(dòng)編號(hào)。
約束可以分為表級(jí)約束和列級(jí)約束兩種:
(1)列級(jí)約束:列級(jí)約束是行定義的一部分,只能夠應(yīng)用在一列上。
(2)表級(jí)約束:表級(jí)約束的定義獨(dú)立于列的定義,可以應(yīng)用在一個(gè)表中的多列上。5.6.2主鍵約束主鍵能夠唯一地確定表中的每一條記錄,主鍵不能取空值。主鍵約束可以保證實(shí)體的完整性,是最重要的一種約束。如果表中有一列被指定為主鍵,則該列不允許指定為NULL屬性,且image和text類型的列不能被指定為主鍵。如果主鍵約束定義在多列上,則其中一列中的值可以重復(fù),但所有列的組合值必須唯一。每個(gè)表最多只能有一個(gè)主鍵。
主鍵的添加、刪除和修改操作方法有兩種:企業(yè)管理器操作法和Transact-SQL語(yǔ)句操作法。
1.通過(guò)企業(yè)管理器完成添加、刪除和修改主鍵的操作在企業(yè)管理器中,右擊要操作的數(shù)據(jù)庫(kù)表,從彈出的快捷菜單中選擇“設(shè)計(jì)表”選項(xiàng),如圖5-16所示,出現(xiàn)“設(shè)計(jì)表”對(duì)話框,如圖5-17所示。在該對(duì)話框中,選擇要設(shè)定為主鍵的字段。如果有多個(gè)字段作為主鍵,則在按住Ctrl鍵的同時(shí),用鼠標(biāo)單擊每個(gè)要選的字段,然后右擊選中的某個(gè)字段,從彈出的快捷菜單中選擇“設(shè)置主鍵”選項(xiàng),如圖5-18所示。或者通過(guò)單擊工具欄上的按鈕來(lái)設(shè)定主鍵,被設(shè)定為主鍵的字段左端都有標(biāo)志。圖5-16“設(shè)計(jì)表”選項(xiàng)圖5-17“設(shè)計(jì)表”對(duì)話框圖5-18“設(shè)置主鍵”選項(xiàng)
在企業(yè)管理器中既可以刪除已經(jīng)設(shè)定的主鍵,也可以設(shè)定其他字段為主鍵。右擊某個(gè)字段,從彈出的快捷菜單中選擇“屬性”選項(xiàng),則出現(xiàn)“屬性”對(duì)話框。在該對(duì)話框中選擇“索引/鍵”選項(xiàng)卡,如圖5-19所示,在“選定的索引”選項(xiàng)欄中選擇主鍵的名稱,單擊“刪除”按鈕就可以刪除了。圖5-19“索引/鍵”選項(xiàng)卡2.使用Transact-SQL語(yǔ)句設(shè)置主鍵約束其語(yǔ)法形式如下:
CONSTRAINTconstraint_namePRIMARYKEY[CLUSTERED|NONCLUSTERED](column_name[,…n])
其中,各參數(shù)的說(shuō)明如下:●?constraint_name:用于指定約束的名稱。約束的名稱在數(shù)據(jù)庫(kù)中應(yīng)該是唯一的。如果不指定,則系統(tǒng)會(huì)自動(dòng)生成一個(gè)約束名?!?CLUSTERED|NONCLUSTERED:用于指定索引的類型,即聚集索引或者非聚集索引,CLUSTERED為默認(rèn)值?!?column_name:用于指定主鍵的列名。主鍵最多由16個(gè)列組成。
【例5-13】在數(shù)據(jù)庫(kù)college中創(chuàng)建一個(gè)班級(jí)表,并定義班級(jí)編號(hào)為主鍵。增加主鍵后,就限定了該記錄中不能插入編號(hào)相同的兩個(gè)或者多個(gè)數(shù)據(jù)信息,從而保證了表中的記錄信息是唯一的。.程序清單如下:
USEcollegeGOCREATETABLE班級(jí)表(
班級(jí)編號(hào)char(10)NOTNULLPRIMARYKEY,班級(jí)名稱char(20),班主任char(8),專業(yè)char(20),系部名稱char(20))
或者
USEcollegeGOCREATETABLE班級(jí)表(
班級(jí)編號(hào)char(10)NOTNULL,班級(jí)名稱char(20),班主任char(8),專業(yè)char(20),系部名稱char(20),
constraintcons_pkPRIMARYKEY(班級(jí)編號(hào)))5.6.3唯一性約束唯一性約束用于指定一個(gè)或多個(gè)列的組合值具有唯一性,以防止在列中輸入重復(fù)的值。如前所述,每個(gè)表中只能有一個(gè)主鍵,因此當(dāng)表中已經(jīng)有一個(gè)主鍵值時(shí),如果還要保證其他的標(biāo)識(shí)符唯一,則可以使用唯一性約束。當(dāng)使用唯一性約束時(shí),需要考慮以下幾個(gè)因素:●使用唯一性約束的字段允許為空值。●一個(gè)表中允許有多個(gè)唯一性約束?!窨梢园盐ㄒ恍约s束定義在多個(gè)字段上(單一字段不唯一,多個(gè)字段聯(lián)合起來(lái)是唯一的)。●唯一性約束用于在指定字段上強(qiáng)制創(chuàng)建一個(gè)唯一性索引。創(chuàng)建唯一性約束的方法通常有如下兩種。1.通過(guò)企業(yè)管理器完成創(chuàng)建和修改唯一性約束的操作其步驟如下:
(1)在企業(yè)管理器中,展開(kāi)指定的服務(wù)器和要操作的數(shù)據(jù)庫(kù),選擇“表格”選項(xiàng),然后在右欄窗口中單擊選定的表格,并從彈出的菜單中選擇“設(shè)計(jì)表”選項(xiàng),就出現(xiàn)“設(shè)計(jì)表”對(duì)話框。
(2)在該對(duì)話框中右擊某個(gè)字段,從彈出的快捷菜單中選擇“屬性”選項(xiàng),則出現(xiàn)“屬性”對(duì)話框。
(3)在屬性對(duì)話框中選擇“索引/鍵”選項(xiàng)卡,然后單擊“新建”按鈕,在“列名”選項(xiàng)欄中選擇字段名稱,選擇復(fù)選框“創(chuàng)建UNIQUE”和“約束”。
(4)創(chuàng)建完成后單擊“關(guān)閉”按鈕。
(5)在表格編輯對(duì)話框中選擇“保存”按鈕,即可使數(shù)據(jù)庫(kù)的上述修改生效。2.使用Transact-SQL語(yǔ)句完成唯一性約束的操作其語(yǔ)法形式如下:
CONSTRAINTconstraint_nameUNIQUE[CLUSTERED|NONCLUSTERED](column_name[,…n])
其中,各參數(shù)說(shuō)明如下:●?constraint_name:唯一性約束的名稱?!?UNIQUE:指定通過(guò)唯一索引為給定的一列或多列提供實(shí)體完整性約束。●?CLUSTERED:指定創(chuàng)建簇索引?!?NONCLUSTERED:指定創(chuàng)建非蔟索引?!纠?-14】創(chuàng)建一個(gè)學(xué)生表,其中身份證字段具有唯一性。程序清單如下:
USEcollegeGOCREATETABLE學(xué)生表
(
學(xué)號(hào)char(10)NOTNULLPRIMARYKEY,
姓名char(8),性別char(2)DEFAULT'男',生日datetime,身份證char(50),
constraintuk_idunique(身份證))5.6.4檢查約束檢查約束是指對(duì)輸入列或者整個(gè)表中的值設(shè)置檢查條件,以限制輸入值,保證數(shù)據(jù)庫(kù)數(shù)據(jù)的完整性。當(dāng)使用檢查約束時(shí),應(yīng)該考慮和注意以下幾點(diǎn):
(1)一個(gè)列級(jí)檢查約束只能與限制的列中字段有關(guān),一個(gè)表級(jí)檢查約束只能與限制的表中字段有關(guān)。
(2)一個(gè)表中可以定義多個(gè)檢查約束。
(3)每個(gè)CREATETABLE語(yǔ)句中的每個(gè)字段只能定義一個(gè)檢查約束。
(4)若在多個(gè)字段上定義檢查約束,則必須將檢查約束定義為表級(jí)約束。(5)當(dāng)執(zhí)行INSERT語(yǔ)句或者UPDATE語(yǔ)句時(shí),檢查約束將驗(yàn)證數(shù)據(jù)。
(6)檢查約束中不能包含子查詢。創(chuàng)建檢查約束常用的操作方法有如下兩種。
1.使用企業(yè)管理器創(chuàng)建檢查約束與創(chuàng)建唯一性約束類似,在打開(kāi)“表格設(shè)計(jì)”對(duì)話框后,右擊要設(shè)置檢查約束的字段,從彈出的快捷菜單中選擇“屬性”選項(xiàng),出現(xiàn)“屬性”對(duì)話框。在該對(duì)話框中選擇“CHECK約束”選項(xiàng)卡,單擊“新建”按鈕后,就可以在約束表達(dá)式欄中輸入檢查約束的表達(dá)式,如圖5-20所示。輸入完檢查約束后,在“約束名”文本框中輸入該約束的名稱,然后單擊“關(guān)閉”按鈕。最后,在退出表格設(shè)計(jì)對(duì)話框時(shí)保存所做的修改。圖5-20“CHECK約束”選項(xiàng)卡2.使用Transact-SQL語(yǔ)句創(chuàng)建檢查約束其語(yǔ)法形式如下:.
CONS
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 優(yōu)惠合同協(xié)議的意義
- 全新電腦購(gòu)銷意向
- 教官發(fā)展服務(wù)合同
- 公路工程招標(biāo)文件的標(biāo)準(zhǔn)范本
- 育肥豬購(gòu)銷協(xié)議
- 有機(jī)紗線購(gòu)銷合同
- 招標(biāo)文件范本搖號(hào)定標(biāo)的合同條款
- 童裝采購(gòu)合同
- 代理招商合作合同定制
- 個(gè)人工作保安全
- 湖北省咸寧市通城縣2022-2023學(xué)年八年級(jí)上學(xué)期期末質(zhì)量檢測(cè)數(shù)學(xué)試卷(含解析)
- 【MOOC】法理學(xué)-西南政法大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 2024年新湘教版七年級(jí)上冊(cè)數(shù)學(xué)教學(xué)課件 第4章 圖形的認(rèn)識(shí) 章末復(fù)習(xí)
- 2024年民用爆炸物品運(yùn)輸合同
- 國(guó)家開(kāi)放大學(xué)24237丨學(xué)前兒童語(yǔ)言教育活動(dòng)指導(dǎo)(統(tǒng)設(shè)課)期末終考題庫(kù)及答案
- 2024-2030年中國(guó)離合器制造行業(yè)運(yùn)行動(dòng)態(tài)及投資發(fā)展前景預(yù)測(cè)報(bào)告
- 【MOOC】大學(xué)生創(chuàng)新創(chuàng)業(yè)教育-云南大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 《個(gè)體防護(hù)裝備安全管理規(guī)范AQ 6111-2023》知識(shí)培訓(xùn)
- 客戶管理系統(tǒng)技術(shù)服務(wù)合同
- 北京交通大學(xué)《成本會(huì)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 治療皮膚病藥膏市場(chǎng)需求與消費(fèi)特點(diǎn)分析
評(píng)論
0/150
提交評(píng)論