版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第三章 表的創(chuàng)建與管理,,主要內容,3.1 數(shù)據(jù)類型 3.2 表的創(chuàng)建3.3 表結構的修改3.4 表的重命名與刪除3.5 向表中添加、更新、刪除數(shù)據(jù)3.6 數(shù)據(jù)完整性的概念與實施方法,1.表的概念:表是數(shù)據(jù)庫的數(shù)據(jù)對象,用于存儲和操作數(shù)據(jù)的一種邏輯結構,是一系列列的集合。2.表的構成:表由表頭和若干行數(shù)據(jù)構成。3.表的特性:表中每一行代表一個惟一的記錄,每列代表一個域。,,,學生成
2、績表,,表名,,表頭,數(shù)據(jù),,行,,列,,,4.對表的操作:填表:將數(shù)據(jù)寫入表中。修改:改正表中的數(shù)據(jù)信息。刪除:刪除表中記錄信息。查詢:在表中按某些條件查找記錄信息。5.注意:在SQL Server2000中,每個數(shù)據(jù)庫最多可存儲20億個表,每個表可以有1024列,每行最多可以存儲8060字節(jié)。SQL Server中表分為:永久表和臨時表。其中永久表在創(chuàng)建后,除非用戶刪除否則將一直存放在數(shù)據(jù)庫文件中;而臨時表則會在用戶退
3、出或進行系統(tǒng)修復時被自動刪除。,6.數(shù)據(jù)類型:(1)相關概念:概念:定義每個列所能存放的數(shù)據(jù)值和存儲格式。精度:指數(shù)值數(shù)據(jù)中所存儲的十進制數(shù)據(jù)的總位數(shù)。例如:tinyint類型可以表示范圍是0-255,其精度為3。小數(shù)位數(shù):指數(shù)值數(shù)據(jù)中小數(shù)點右邊可以有的數(shù)字位數(shù)的最大值。例:89.658,其精度為5,小數(shù)位數(shù)為3。長度:存儲數(shù)據(jù)所用的字節(jié)數(shù)。例:tinyint所用長度為1字節(jié)。,,(2)種類:系統(tǒng)數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型。
4、 SQL Server2000中列的數(shù)據(jù)類型既可以是系統(tǒng)數(shù)據(jù)類型也可以是用戶自定義數(shù)據(jù)類型。,學生成績管理系統(tǒng):學生表(學號、姓名、系別號)Student(ID,Name,DepartID)系別表(系別號,系別名稱)Department(ID,Title)成績表(學號、課程號、成績)Achievement(StuID,CorsID,Achieve)課程表(課程號、課程名稱、專業(yè)號)Course(ID,Name,S
5、peciaID)專業(yè)表(專業(yè)號、專業(yè)名稱)speciality (ID,Name),3.1數(shù)據(jù)類型,3.1.1系統(tǒng)數(shù)據(jù)類型3.1.2自定義數(shù)據(jù)類型,3.1.1系統(tǒng)數(shù)據(jù)類型,1. 整型數(shù)據(jù)類型2. 浮點數(shù)據(jù)類型 3. 字符數(shù)據(jù)類型 4. 日期和時間數(shù)據(jù)類型 5. 文本和圖形數(shù)據(jù)類型,6. 貨幣數(shù)據(jù)類型 7. 位數(shù)據(jù)類型 8. 二進制數(shù)據(jù)類型 9. 特殊數(shù)據(jù)類型 10. 新增數(shù)據(jù)類型,,,,,1. 整型數(shù)據(jù)類型,整型數(shù)
6、據(jù)類型是最常用的數(shù)據(jù)類型之一,它主要用來存儲數(shù)值,可以直接進行數(shù)據(jù)運算,而不必使用函數(shù)轉換。 int(integer):int(或integer)數(shù)據(jù)類型可以存儲從-231(-2,147,483,648)到231-1(2,147,483,647)范圍之間的所有正負整數(shù)。 Smallint:可以存儲從-215(-32,768)到215-1范圍之間的所有正負整數(shù) 。Tinyint:可以存儲從0到255范圍之間的所有正整數(shù)。,2. 浮點
7、數(shù)據(jù)類型,浮點數(shù)據(jù)類型用于存儲十進制小數(shù)。浮點數(shù)值的數(shù)據(jù)在SQL Server中采用只入不舍的方式進行存儲 。Real:可以存儲正的或者負的十進制數(shù)值,最大可以有7位精確位數(shù)。 Float:可以精確到第15位小數(shù),其范圍從-1.79E-308到1.79E+308。 Decimal和numeric:Decimal數(shù)據(jù)類型和numeric數(shù)據(jù)類型完全相同,它們可以提供小數(shù)所需要的實際存儲空間,但也有一定的限制,可以用2到17個字節(jié)來存
8、儲從-1038-1到1038-1之間的數(shù)值。,3. 字符數(shù)據(jù)類型,字符數(shù)據(jù)類型可以用來存儲各種字母、數(shù)字符號和特殊符號。 Char:其定義形式為char(n),每個字符和符號占用一個字節(jié)的存儲空間。 Varchar:其定義形式為varchar(n)。用char數(shù)據(jù)類型可以存儲長達255個字符的可變長度字符串 。Nchar:其定義形式為nchar(n)。 Nvarchar:其定義形式為nvarchar(n)。,4. 日期和時間數(shù)據(jù)
9、類型,Datetime:用于存儲日期和時間的結合體 。它可以存儲從公元1753年1月1日零時起到公元9999年12月31日23時59分59秒之間的所有日期和時間 。Smalldatetime:與datetime數(shù)據(jù)類型類似,但其日期時間范圍較小,它存儲從1900年1月1日到2079年6月6日內的日期。,5. 文本和圖形數(shù)據(jù)類型,Text:用于存儲大量文本數(shù)據(jù),其容量理論上為1到231-1(2,147,483,647)個字節(jié),但實際應用
10、時要根據(jù)硬盤的存儲空間而定。 Ntext:與text數(shù)據(jù)類型類似,存儲在其中的數(shù)據(jù)通常是直接能輸出到顯示設備上的字符,顯示設備可以是顯示器、窗口或者打印機。Image:用于存儲照片、目錄圖片或者圖畫,其理論容量為231-1(2,147,483,647)個字節(jié)。,6. 貨幣數(shù)據(jù)類型,Money:用于存儲貨幣值,存儲在money數(shù)據(jù)類型中的數(shù)值以一個正數(shù)部分和一個小數(shù)部分存儲在兩個4字節(jié)的整型值中,存儲范圍為-9223372136854
11、77.5808到922337213685477.5808,精度為貨幣單位的萬分之一。Smallmoney:與money數(shù)據(jù)類型類似,但其存儲的貨幣值范圍比money數(shù)據(jù)類型小,其存儲范圍為-214748.3468到214748.3467。,7. 位數(shù)據(jù)類型,Bit:稱為位數(shù)據(jù)類型,其數(shù)據(jù)有兩種取值:0和1,長度為1字節(jié)。,8. 二進制數(shù)據(jù)類型,Binary:其定義形式為binary(n),數(shù)據(jù)的存儲長度是固定的,即n+4字節(jié),當輸入的
12、二進制數(shù)據(jù)長度小于n時,余下部分填充0。 Varbinary:其定義形式為varbinary(n),數(shù)據(jù)的存儲長度是變化的,它為實際所輸入數(shù)據(jù)的長度加上4字節(jié)。其它含義同binary。,9. 特殊數(shù)據(jù)類型,Timestamp:亦稱時間戳數(shù)據(jù)類型,它提供數(shù)據(jù)庫范圍內的唯一值,反應數(shù)據(jù)庫中數(shù)據(jù)修改的相對順序,相當于一個單調上升的計數(shù)器。 Uniqueidentifier:用于存儲一個16字節(jié)長的二進制數(shù)據(jù)類型,它是SQL Server根
13、據(jù)計算機網(wǎng)絡適配器地址和CPU時鐘產(chǎn)生的唯一號碼而生成的全局唯一標識符代碼(Globally Unique Identifier,簡寫為GUID)。,3.1.2 自定義數(shù)據(jù)類型,創(chuàng)建用戶定義類型要提供三個參數(shù):名稱、系統(tǒng)數(shù)據(jù)類型、是否允許為空。創(chuàng)建方法:1. 使用企業(yè)管理器(Enterprise Manager)創(chuàng)建用戶自定義數(shù)據(jù)類型。,,,,2. 利用系統(tǒng)存儲過程創(chuàng)建用戶自定義數(shù)據(jù)類型 。系統(tǒng)存儲過程sp_addtype為用
14、戶提供了T_SQL語句創(chuàng)建自定義數(shù)據(jù)類型的途徑,其語法形式如下:sp_addtype [@typename=] type,[@phystype=] system_data_type[, [@nulltype=] ‘null_type’][, [@owner=] ‘owner_name’],使用Tranact-SQL創(chuàng)建用戶定義數(shù)據(jù)類型:,格式:sp_addtype 類型名, ‘系統(tǒng)數(shù)據(jù)類型’ [,是否為空]例: sp_
15、addtype wx , 'int' , 'not null',使用Tranact-SQL刪除用戶定義數(shù)據(jù)類型:,格式:sp_droptype 類型名 例: sp_droptype wx,例子3-1:自定義一個地址數(shù)據(jù)類型,exec sp_addtype address, ‘varchar(80)’, ‘not null’其運行結果如下:(1 row(s) affected)type
16、 added.,例3-2在Student數(shù)據(jù)庫中創(chuàng)建名為Tel(電話號碼)的自定義數(shù)據(jù)類型,定義為VARCHAR數(shù)據(jù)類型,長度為30,且不能為NULL,Use StudentGoExec sp_addtype Tel,’Varchar(30)’,’not null’Go,,,3.2 表的創(chuàng)建,在SQL Server 2000中,每個數(shù)據(jù)庫中最多可以創(chuàng)建20億個表,用戶創(chuàng)建數(shù)據(jù)庫表時,最多可以定義1024列,也就是可以定義1024個
17、字段。 SQL Server 2000提供了兩種方法創(chuàng)建數(shù)據(jù)庫表,第一種方法是利用企業(yè)管理器(Enterprise Manager)創(chuàng)建表;另一種方法是利用Transact-SQL語句中的create命令創(chuàng)建表。,1. 利用Enterprise Manager創(chuàng)建表,在Enterprise Manager中,展開指定的服務器和數(shù)據(jù)庫,打開想要創(chuàng)建新表的數(shù)據(jù)庫用右鍵單擊表對象,從彈出的快捷菜單中選擇新建表選項,或者在工具欄中選擇圖標,
18、就會出現(xiàn)新建表對話框在該新建表對話框中,可以定義列的以下屬性:列名稱、數(shù)據(jù)類型、長度、精度、小數(shù)位數(shù)、是否允許為空、缺省值、標識列、標識列的初始值、標識列的增量值和是否有行的標識。 然后根據(jù)提示進行設置。,3.2.1數(shù)據(jù)庫列屬性,1、允許空屬性2、默認值屬性3、標識屬性,作用:插入數(shù)據(jù)時,若想省略某列的值,可將之設置為空屬性注意:1、空值并不等于0、空白或者空字符串(“”),意味著沒有輸入2、若指定一個列不允許空值,則必須確
19、保該列永遠含有數(shù)據(jù)3、Sql Server2000中,默認允許空值4、定義了主鍵約束或標識屬性的列不允許空值,1.空值屬性,2.默認值屬性,作用:若為某列設置了默認值,則插入數(shù)據(jù)時,若未給此列輸入數(shù)據(jù),Sql Server2000自動將默認值填入該字段中設置方法:直接設置默認值、自定義默認值對象,3.標識屬性,作用:將某列設置標識后,SQL SERVER2000自動為該列生成數(shù)字,這個數(shù)字可以在表中唯一標識一行。設置了標識屬性的
20、列為標識列列的標識屬性由兩部分組成:初始值和增量注意:不是所有列都可以設置標識屬性,取決于列的數(shù)據(jù)類型,建一個教師表表名:TeacherInfo,自定義默認值對象,若一個默認值對象已經(jīng)綁定到某列,則默認值不可以再被修改,而且默認值對象不可被刪除,管理數(shù)據(jù)表,修改數(shù)據(jù)表刪除數(shù)據(jù)表操作數(shù)據(jù)表中的數(shù)據(jù),修改數(shù)據(jù)表步驟:在企業(yè)管理器中,選中要修改的數(shù)據(jù)表,單擊鼠標右鍵,在彈出的菜單中選擇“設計表”,彈出設計表窗口操作:添加列、刪
21、除列、修改列注意:若要修改列的數(shù)據(jù)類型,要滿足以下條件1、新數(shù)據(jù)類型不能為timestamp2、舊的數(shù)據(jù)類型必須可以隱式轉換為新的數(shù)據(jù)類型3、若定義了列的標識屬性,則新數(shù)據(jù)類型需為支持標識屬性的數(shù)據(jù)類型,刪除數(shù)據(jù)表步驟:在企業(yè)管理器中,選中要刪除的數(shù)據(jù)表,單擊鼠標右鍵,在彈出的菜單中選擇“刪除”命令,彈出確認對話框。,操作表中的數(shù)據(jù),插入數(shù)據(jù)刪除數(shù)據(jù)更新數(shù)據(jù)查詢數(shù)據(jù),插入數(shù)據(jù),在企業(yè)管理器中,選中要插入數(shù)據(jù)的表,單擊鼠
22、標右鍵,在彈出的菜單中選擇“打開表”命令中的“返回所有行”,在打開的窗口中輸入插入的數(shù)據(jù),逐字段輸入注意:1、不要向設置了標識屬性的列中輸入2、若字段不允許為空,且未設置默認值,則必須給該字段設置數(shù)據(jù)值,查詢數(shù)據(jù),在企業(yè)管理器中,選中要插入數(shù)據(jù)的表,單擊鼠標右鍵,在彈出的菜單中選擇“打開表”命令中的“查詢”,,使用T-SQL語句,,1. 利用create命令創(chuàng)建表,其語法形式如下:CREATE TABLE
23、; [ database_name.[ owner ] .| owner.] table_name ( { | column_name AS computed_column_expression|} [,…n])[ ON { filegroup | DEFAULT } ],創(chuàng)建表的各參數(shù)的說明如下:,database_name:用于指定在其中創(chuàng)建表的數(shù)據(jù)庫名稱。
24、owner:用于指定新建表的所有者的用戶名 。table_name:用于指定新建的表的名稱。 column_name:用于指定新建表的列的名稱。 computed_column_expression:用于指定計算列的列值的表達式。 ON {filegroup | DEFAULT}:用于指定存儲表的文件組名。 TEXTIMAGE_ON:用于指定 text、ntext 和 image 列的數(shù)據(jù)存儲的文件組。 data_type
25、:用于指定列的數(shù)據(jù)類型 。DEFAULT:用于指定列的缺省值。,建一個教師表表名:TeacherInfo,Create Table TeacherInfo( ID int Identity(1,1) not null, Name varchar(20) NOT NULL, Sex Char(2) null, Hire_Date datetime not null default(getd
26、ate()), Phone varchar(20) not null, Sallary smallmoney null, Address varchar(100) null, Email varchar(30) null),建一個學生表表名:StudentInfo,2.使用ALTER語句修改表,ALTER TABLE [ [ database_name . ] owner.]table_nam
27、e[ WITH NOCHECK ]ADD{ [ column_name datatype [ column_constraints ] | [ [ , ] table_constraint ] ] }[, [ { next_col_name | next_table_constraint } ] …] }| DROP[ CONSTRAINT ] constraint_name| COLUMN column}[,…n ],1、
28、為StudentInfo表添加“地址”屬性,允許空值Alter table StudentInfo add Address Varchar(50) null2、將剛添加“地址”屬性刪除Alter table StudentInfo drop column Address3、修改“地址”屬性,將長度增長為100個字節(jié)Alter table StudentInfo alter column Address v
29、archar(100) null,3.用INSERT語句向表中插入數(shù)據(jù),INSERT [ INTO]{ table_name WITH ( [ ...n ] ) | view_name| rowset_function_limited } {[ ( column_list ) ] { VALUES( { DEFAULT | NULL | expression } [ ,...n] ) | derived
30、_table| execute_statement } },Insert into StudentInfoValues( '張三', '男', '2011-3-21', '1990-1-1', '1378512257', '124@125.com', '聊城'),Insert
31、 into StudentInfo( [Name], [Entr_date], [Birthday], [Phone])Values( '張三', '2011-3-21', '1990-1-1', '1378512257'),4.用UPDATE語句修改表數(shù)據(jù),UPDATE { table_name WITH ( [ ...n ]
32、 )}SET { column_name = {expression | DEFAULT | NULL }WHERE ,,Update StudentInfoset [Name]='張三‘Where [Id] = 1,表的重命名和刪除,重命名:使用T-SQL語言進行例:USE StudentGoEXEC sp_rename ‘StudentInfo', ‘StuInfo'GO,,利用DROP
33、TABLE語句刪除表DROP TABLE語句可以刪除一個表和表中的數(shù)據(jù)及其與表有關的所有索引、觸發(fā)器、約束、許可對象。DROP TABLE語句的語法形式如下:DROP TABLE table_name,找一下錯誤!,數(shù)據(jù)記錄不唯一,,數(shù)據(jù)記錄內容不正確,數(shù)據(jù)記錄內容不一致,要求:學生年齡不能超過45歲,數(shù)據(jù)記錄內容不符合要求,數(shù)據(jù)記錄不唯一,數(shù)據(jù)記錄內容不正確,數(shù)據(jù)記錄內容不一致,數(shù)據(jù)記錄內容不符合要求,喪失數(shù)據(jù)完整性,,,,,數(shù)
34、據(jù)完整性,3.6.1數(shù)據(jù)完整性,定義:存儲在數(shù)據(jù)庫中的所有數(shù)據(jù)值均正確的狀態(tài)。如果數(shù)據(jù)庫中存儲有不正確的數(shù)據(jù)值,則該數(shù)據(jù)庫稱為已喪失數(shù)據(jù)完整性。 數(shù)據(jù)完整性是指數(shù)據(jù)庫中數(shù)據(jù)的正確性和一致性,是衡量數(shù)據(jù)庫質量的一個重要標準。,實體完整性域完整性引用完整性用戶自定義完整性,數(shù)據(jù)記錄不唯一,數(shù)據(jù)記錄內容不正確,數(shù)據(jù)記錄內容不一致,數(shù)據(jù)記錄內容不符合要求,數(shù)據(jù)完整性包含四類:,1.實體完整性,實體完整性將每一條記錄定義為表中的唯一
35、實體,即不能重復。,實體完整性強制表中的所有記錄都有一個惟一的標識列。,?,怎樣保證實體完整性,可能是一列,也可能有若干列的組合。,惟一的標識列,,,標識列,,標識列,強制實體完整性的方法有:,?,在數(shù)據(jù)庫中實現(xiàn)實體完整性的方法,UNIQUE約束,PRIMARY KEY約束,IDENTITY屬性,2.域完整性,域完整性的概念是要求表中列的值必須滿足特定的約束和規(guī)則。,?,怎樣保證域完整性,域完整性要求表中指定列的數(shù)據(jù)具有正確的數(shù)據(jù)類型、
36、格式和有效的數(shù)據(jù)范圍。,如:性別字段只能取“男”或“女”;,課程成績取值范圍為0∽100;,姓名字段不能為空;,性別字段的默認值為“男”,通過限制數(shù)據(jù)類型、格式和可能的取值范圍來實現(xiàn)。,?,在數(shù)據(jù)庫中實現(xiàn)域完整性的方法,3.引用完整性(參照完整性),引用完整性確保數(shù)據(jù)庫中多個數(shù)據(jù)表中的數(shù)據(jù)一致,?,怎樣保證引用完整性,引用完整性通過外鍵將引用表和被引用表關聯(lián)起來。確保鍵值在所有表中都必須一致,因此不能引用不存在的值(即指向不存在的行),
37、通過FOREIGN KEY和 CHECK約束,?,怎樣在數(shù)據(jù)庫中保證引用完整性,1、若名單表中無“001”學號列,則成績表中也不能有學號為“001”的列,2、若更改名單表中學號為“001”的列為“101”,則成績表中所有學號為“001”的列都要將學號列改為“101”,2、若刪除名單表中學號為“001” 的列,則成績表中所有學號為“001”的列都要刪除,相關表之間的數(shù)據(jù)一致性要求: 有子必有父 —— 子表中的每一個記錄在對應的主表中必須
38、有一父記錄。插子必有父 —— 在父表中修改記錄時,如果修改了主關鍵字的值,則子表中相關記錄的外部關鍵字值必須同樣修改 父刪子必刪 —— 在父表中刪除記錄時,與該記錄相關的子表中的記錄必須全部刪除。,4.用戶定義完整性,用戶根據(jù)系統(tǒng)設計需要,可以在SQL Server中定義不屬于上述標準類別的特定規(guī)則的用戶完整性定義。所有的完整性類型都支持用戶自定義完整性(CREATE TABLE中的所有列級和表級約束、存儲過程和觸發(fā)器)。,3.6
39、.2 數(shù)據(jù)完整性實施方法,目前有許多關系的DBMS提供了多種定義完整性約束條件或規(guī)則的功能和檢查是否違背完整性約束條件或規(guī)則的方法。DBMS若發(fā)現(xiàn)了用戶的操作使數(shù)據(jù)庫違背了完整性約束條件或規(guī)則,將采取一定的措施,拒絕用戶執(zhí)行此操作。,3.6.3創(chuàng)建和使用規(guī)則,創(chuàng)建規(guī)則,1、使用企業(yè)管理器創(chuàng)建規(guī)則2、使用Create Rule語句,1、使用企業(yè)管理器創(chuàng)建規(guī)則(1)打開相應數(shù)據(jù)庫,展開目錄(2)選擇目錄項[規(guī)則],單擊鼠標右鍵選擇快
40、捷菜單中的“新建規(guī)則….”選項(3)在彈出的規(guī)則屬性菜單中輸入規(guī)則名稱和要滿足的條件,,規(guī)則名稱,,規(guī)則滿足的條件,例6.6.1創(chuàng)建名稱為mobile_phone_rule規(guī)則文本為:@mobile_phone LIKE '1[358][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]‘注意:定義規(guī)則文本時,涉及到列,要在列名前加符號“@”,要使用’’(單引號)將字符常量和日期常量
41、括起來,使用規(guī)則,(1)找到要綁定的規(guī)則,雙擊,,規(guī)則名稱,,選擇目的表,,選擇要綁定的列,然后點擊添加,刪除規(guī)則,首先刪除綁定然后刪除規(guī)則,例6.6.2創(chuàng)建名稱為Age_rule,規(guī)定年齡應在14-45歲之間規(guī)則文本為:@age >=12 and @age<=45,例6.6.3創(chuàng)建名稱為Sex_rule,規(guī)定性別應為男或女規(guī)則文本為:@Sex In (‘男’,’女’),使用T-SQL語句創(chuàng)建使用規(guī)則,創(chuàng)建規(guī)則C
42、REATE RULE rule AS condition_expression rule為規(guī)則的名稱condition_expression是定義規(guī)則的條件 ,在創(chuàng)建規(guī)則時,可以使用任何名稱或符號表示值,但第一個字符必須是 @ 符號。,例6.6.1創(chuàng)建名稱為mobile_phone_rule規(guī)則文本為:@mobile_phone LIKE '1[358][0-9][0-9]
43、[0-9][0-9][0-9][0-9][0-9][0-9][0-9]‘Create rule mobile_phone_ruleAs @mobile_phone LIKE '1[358][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]‘,Create rule Age_ruleAS @Age Between 12 and 45 //AS @Age >=12 and @A
44、ge <=45Create rule Sex_ruleAS @Sex In(‘男’,’女’),使用規(guī)則 Exec sp_bindrule [ @rulename = ] 'rule' , [ @objname = ] 'object_name' [ , [ @futureonly = ] '
45、;futureonly_flag' ] Use StudentExec sp_bindrule ‘mobile_phone_rule’,’stuInfo.Phone’,刪除規(guī)則(1)解除綁定(2)刪除規(guī)則,解除綁定,Use StudentExec sp_unbindrule ’stuInfo.Phone’,刪除規(guī)則,DROP RULE ‘mobile_phone_rule’,,注意:規(guī)則只允許在當前的數(shù)據(jù)庫中創(chuàng)建
46、規(guī)則不能綁定到系統(tǒng)數(shù)據(jù)類型如char、int中規(guī)則不能綁定到數(shù)據(jù)類型為image、text或者timestamp的列,6.6.4 約束,建立和使用約束的目的在于保證數(shù)據(jù)的完整性,設計表時需要定義列的有效值并通過列中數(shù)據(jù)、行中數(shù)據(jù)及表間數(shù)據(jù)決定如何強制保證數(shù)據(jù)的完整性,約束定義關于列中允許值的規(guī)則,是強制完整性的首選方法。約束是獨立于表結構的,它作為數(shù)據(jù)庫定義的一部分在創(chuàng)建表時聲明,可以通過企業(yè)管理器或ALTER TABLE語句添加
47、或刪除。當表被刪除時,表所附帶的所有約束同時被刪除。,1 約束的類型,在SQL Server 2000中有5種約束:主鍵約束(primary key constraint)唯一性約束(unique constraint)檢查約束(check constraint)默認約束(not null constraint)外部鍵約束(foreign key constraint),,Student學生表Course課程表Resul
48、t成績表,主鍵約束,在一個表中,存在著這樣的字段,它在每個記錄中的值都是惟一的,因此可以用來標識表中的各個不同記錄。這樣的字段被稱為關鍵字,關鍵字可以是列或列的組合。例如學生表中的Number列就是一個關鍵字,因為每個學生的學號必須是惟一的。當表中有兩個或兩個以上的列或列的組合滿足以上條件時,稱這些列或列的組合為候選關鍵字。當表的關鍵字多于一個時,可以將其中的一個關鍵字作為主鍵(PRIMARY KEY)。,使用企業(yè)管理器創(chuàng)建主鍵約束
49、,在表設計器中單擊鼠標右鍵,在彈出的快捷菜單中選擇“索引/鍵”,打開“屬性”對話框,在該對話框中可以查看、創(chuàng)建、修改和刪除主鍵,如下圖。,,,使用T-SQL語句創(chuàng)建主鍵約束,語法: CONSTRAINT 主鍵約束名 PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] (列名1 [, 列名2, ... 列名n]),使用CREAT
50、E TABLE語句創(chuàng)建“Test”表,同時定義“TNo”列為主鍵。 CREATE TABLE Test ( TNo int, TName varchar(50), CONSTRAINT PK_Test PRIMARY KEY (TNo) ),CREATE TABLE Test ( TNo int Primay Key, TName varchar
51、(50),),使用CREATE TABLE語句創(chuàng)建“SC”表,同時定義“SNo”列和“CNo”列為主鍵。 CREATE TABLE SC ( SNo varchar(20), CNo varchar(50), Grade int, CONSTRAINT PK_SC PRIMARY KEY (SNo,CNo) ),惟一性約束,惟一性約束可以保證除主鍵外的其他一個或多個列的
52、數(shù)據(jù)惟一性,以防止在列中輸入重復的值。兩種創(chuàng)建惟一性約束的方法使用企業(yè)管理器創(chuàng)建惟一性約束使用T-SQL語句創(chuàng)建惟一性約束,使用企業(yè)管理器創(chuàng)建惟一性約束,在表設計器中單擊鼠標右鍵,在彈出的快捷菜單中選擇“索引/鍵”,打開“屬性”對話框,在這里可以查看、創(chuàng)建、修改和刪除鍵。單擊“新建”按鈕,選中“創(chuàng)建UNIQUE”復選框,可以創(chuàng)建唯一性約束,如下圖所示。,使用T-SQL語句創(chuàng)建惟一性約束,語法:CONSTRAINT 約束名
53、 UNIQUE [ CLUSTERED | NONCLUSTERED ] (列名1 [, 列名2, ... 列名n]),使用CREATE TABLE語句創(chuàng)建“Test”表,同時定義“TNo”列為主鍵,“TName”列為唯一性約束。 CREATE TABLE Test ( TNo int, TName varchar(50), CONSTRAINT PK_Test PRIMARY
54、KEY (TNo), CONSTRAINT IX_Test UNIQUE (TName) ),檢查約束,檢查約束指定表中一列或多列可以接受的數(shù)據(jù)值或格式。例如,表“學生”中的“入學成績”列的值應該大于或等于0。兩種創(chuàng)建檢查約束的方法使用企業(yè)管理器創(chuàng)建檢查約束使用T-SQL語句創(chuàng)建檢查約束,使用企業(yè)管理器創(chuàng)建檢查約束,在表設計器中單擊右鍵,在彈出菜單中選擇“CHECK約束”,打開“屬性”對話框,在這里可以查看、創(chuàng)建
55、、修改和刪除檢查約束。,,,,,使用CREATE TABLE語句創(chuàng)建“學生”表,同時創(chuàng)建檢查約束,定義“入學成績”列的值大于或等于0。 CREATE TABLE 學生 ( 記錄編號 int IDENTITY(1,1), 姓名 varchar(50) NOT NULL, 性別 bit DEFAULT(0), 班級 varchar(50) NOT NULL, 入學成
56、績 float DEFAULT(0), 所屬院系 int NOT NULL CONSTRAINT PK_學生 PRIMARY KEY (記錄編號), CONSTRAINT IX_學生 UNIQUE (姓名), CONSTRAINT CK_學生 CHECK (入學成績>=0) ),使用CREATE TABLE語句創(chuàng)建“客戶”表,同時創(chuàng)建檢查約束,定義“
57、郵政編碼”列的值是由6位數(shù)字組成的字符串。 CREATE TABLE 客戶 ( 記錄編號 int IDENTITY(1,1), 客戶單位 varchar(50) NOT NULL, 地址 varchar(100) NOT NULL, 郵政編碼 varchar(10) NOT NULL, CONSTRAINT PK_客戶 PRIMARY KEY (記錄編號), C
58、ONSTRAINT IX_客戶 UNIQUE (客戶單位), CONSTRAINT CK_客戶 CHECK (郵政編碼 LIKE '[0-9][0-9][0-9][0-9][0-9] [0-9]') ),一個列級檢查約束只能與限制的字段有關;一個表級檢查約束只能與限制的表中字段有關。一個表中可以定義多個檢查約束。每個CREATE TABLE語句中每個字段只能定義一個檢查約束。在多個字段上定義檢查約
59、束,則必須將檢查約束定義為表級約束。當執(zhí)行INSERT語句或者UPDATE語句時,檢查約束將驗證數(shù)據(jù)。檢查約束中不能包含子查詢。,Default約束,當表中的某列必須有值,并且當使用INSERT命令向數(shù)據(jù)表插入記錄數(shù)據(jù)時,若用戶沒有明確指定該列的值,該列也需要有一個明確值的情況下,就需要使用DEFAULT約束。使用了DEFAULT約束的列,SQL Server將根據(jù)用戶的插入數(shù)據(jù),自動維護域完整性:當用戶插入時該列有指定值,則該列
60、使用該值插入,否則使用DEFAULT約束中指定的默認值。DEFAULT約束可以使用以下方法實現(xiàn):l 作為表定義的一部分在創(chuàng)建表時創(chuàng)建。l 添加到現(xiàn)有表中;l 刪除現(xiàn)有的 DEFAULT 定義。,使用缺省約束時,應該注意以下幾點:每個字段只能定義一個缺省約束。如果定義的缺省值長于其對應字段的
61、允許長度,那么輸入到表中的缺省值將被截斷。不能加入到帶有IDENTITY屬性或者數(shù)據(jù)類型為timestamp的字段上。如果字段定義為用戶定義的數(shù)據(jù)類型,而且有一個缺省綁定到這個數(shù)據(jù)類型上,則不允許該字段有缺省約束。,外鍵約束,若列或列的組合不是本表的關鍵字,而是另一個表的關鍵字,則稱這些列或列的組合是外鍵(FOREIGN KEY)。一般表與表之間通過主鍵和外鍵進行連接,通過它可以強制表與表之間的參照完整性。FOREIGN KEY約
62、束要求列中的每個值在被引用表中對應的被引用列中都存在。如學生情況表(Student)表中的所在班級(ClassID)就是一個外鍵,它與班級情況表(Class)表中的主鍵班號(ClassID)進行關聯(lián)。,使用T-SQL語句創(chuàng)建外部鍵約束,語法: CONSTRAINT 約束名 FOREIGN KEY (列名1 [, 列名2, ..., 列名n]) REFERENCES 關聯(lián)表 (關聯(lián)列名1
63、 [, 關聯(lián)列名2, ..., 關聯(lián)列名n]),如果不指定約束名,則系統(tǒng)會自動分配一個名稱。FOREIGN KEY關鍵字指定當前創(chuàng)建的約束類型為外部鍵約束。REFERENCES關鍵字指定與當前創(chuàng)建或修改的表相關聯(lián)的表和列。,使用ALTER TABLE語句修改“學生”表,與“院系”表建立外部鍵約束。主鍵列為“院系”表的“記錄編號”列,外部鍵列為“學生”表的“所屬院系”列。 ALTER TAB
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論