




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章表的創(chuàng)建5.1列的屬性5.2
表結(jié)構(gòu)的創(chuàng)建和管理5.3表中數(shù)據(jù)的修改5.4數(shù)據(jù)的完整性復(fù)習(xí)思考題5.1列的屬性
表的列名在同一個(gè)表中具有唯一性;同一列的數(shù)據(jù)屬于同一種數(shù)據(jù)類型。除了用列名和數(shù)據(jù)類型來(lái)指定列的屬性外,還可以定義其他屬性:NULL或NOTNULL屬性,IDENTITY屬性。NULL或NOTNULL屬性
如果表的某一列被指定具有NULL屬性,那么就允許在插入數(shù)據(jù)時(shí)省略該列的值;反之,如果表的某一列被指定具有NOTNULL屬性,那么就不允許在沒(méi)有指定列缺省值的情況下插入省略該列值的數(shù)據(jù)行。在SQLServer中,列缺省屬性是NULL。IDENTITY屬性IDENTITY屬性可以使表的列包含系統(tǒng)自動(dòng)生成的數(shù)字。這種數(shù)字在表中可以唯一標(biāo)識(shí)表的每一行。當(dāng)用IDENTITY屬性定義一個(gè)列時(shí),可以指定一個(gè)初始值和一個(gè)增量。插入數(shù)據(jù)時(shí),初始值在插入第一行數(shù)據(jù)時(shí)使用,以后就由SQLServer根據(jù)上一次使用的IDENTITY值加上增量得到新的IDENTITY值。如果不指定初始值和增量值,則其缺省值均為1。IDENTITY屬性適用于INT、SMALLINT、TINYINT、DECIMAL(P,0)、NUMERIC(P,0)數(shù)據(jù)類型的列。注意:一個(gè)列不能同時(shí)具有NULL屬性和IDENTITY屬性,只能二者選其一。5.2表結(jié)構(gòu)的創(chuàng)建和管理5.2.1表結(jié)構(gòu)的創(chuàng)建5.2.2表結(jié)構(gòu)的修改5.2.3表結(jié)構(gòu)的刪除5.2.1表結(jié)構(gòu)的創(chuàng)建使用SQL語(yǔ)句創(chuàng)建表使用管理控制臺(tái)創(chuàng)建表創(chuàng)建臨時(shí)表使用SQL語(yǔ)句創(chuàng)建表CREATETABLE
[database_name.[owner].|owner.]table_name({<column_definition>|column_nameAScomputed_column_expression|<table_constraint>}[,...n])[ON
{filegroup|DEFAULT}][TEXTIMAGE_ON{filegroup|DEFAULT}]<column_definition>::=
{
column_name
data_type}[COLLATE<collation_name>][[
DEFAULT
constant_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]
REFERENCES
ref_table[(ref_column)]
[ONDELETE{CASCADE|NOACTION}]
[ONUPDATE{CASCADE|NOACTION}]
[NOTFORREPLICATION]--外鍵約束
]
|CHECK[NOTFORREPLICATION]
(logical_expression)--檢查約束
}
注意:一個(gè)表至少有一列,但最多不超過(guò)1024個(gè)列。每個(gè)數(shù)據(jù)庫(kù)中最多可以創(chuàng)建200萬(wàn)個(gè)表。表在存儲(chǔ)時(shí)使用的計(jì)量單位是盤(pán)區(qū)(Extent)。
一個(gè)盤(pán)區(qū)分為8個(gè)數(shù)據(jù)頁(yè),每頁(yè)8KB。在創(chuàng)建新表時(shí),會(huì)分配給它一個(gè)初始值為一個(gè)盤(pán)區(qū)的存儲(chǔ)空間。當(dāng)增加表的存儲(chǔ)空間時(shí),以盤(pán)區(qū)為單位增加。
表5.1ToyBrand(玩具商標(biāo))表結(jié)構(gòu)例5-1:創(chuàng)建如表5.1所示的商標(biāo)信息表。
CREATETABLE
ToyBrand
(cBrandIdchar(3)NOTNULL,cBrandNamechar(20)NOTNULL,CONSTRAINTpkBrandIdPRIMARYKEY(cBrandId)--創(chuàng)建主鍵
)CONSTRAINTpkBrandId
PRIMARYKEY表5.2Toys(玩具)表結(jié)構(gòu)CREATETABLEToys(cToyIdchar(6)NOTNULL,vToyNamevarchar(20)NOTNULL,……cBrandIdchar(3)NULL,……
CONSTRAINTpkToyIdPRIMARYKEY(cToyId),CONSTRAINTfkBrandIdFOREIGNKEY(cBrandid)
ReferencesToyBrand(cBrandId))CONSTRAINTpkToyId
PRIMARYKEYCONSTRAINTfkbrandidFOREIGNKEY
ReferencesToyBrand(cBrandId)例5-3:為T(mén)oyUniverse數(shù)據(jù)庫(kù)在文件組newgroup上創(chuàng)建表orders,如下表所示,其中:dOrderDate的默認(rèn)值為當(dāng)前日期。CREATETABLEOrders(cOrderNochar(6)NOTNULL,dOrderDatedatetimeDEFAULTgetdate(),……mTotalCostmoneyNULL,……
CONSTRAINTpkOrderNoPRIMARYKEY(cOrderNo))
ONnewgroupCONSTRAINTpkOrderNo
PRIMARYKEY使用管理控制臺(tái)創(chuàng)建表創(chuàng)建臨時(shí)表
可以用CREATETABLE
命令創(chuàng)建局部的表或全局作用的臨時(shí)表。
其語(yǔ)法與創(chuàng)建一般表基本相同,只是在局部臨時(shí)表的表名前要使用符號(hào)“#”,全局臨時(shí)表的表名前要使用符號(hào)“##”,以便與一般的表相區(qū)別。例5-3:創(chuàng)建一個(gè)局部臨時(shí)表test123。
CREATETABLE#test123(test_idSMALLINT,test_nameCHAR(10),)提示:當(dāng)用戶斷開(kāi)連接時(shí)沒(méi)有除去臨時(shí)表,SQLServer將自動(dòng)除去臨時(shí)表。
5.2.2表結(jié)構(gòu)的修改用SQL語(yǔ)句修改表結(jié)構(gòu)用管理控制臺(tái)修改表結(jié)構(gòu)用存儲(chǔ)過(guò)程sp_rename修改表名和列名用SQL語(yǔ)句修改表結(jié)構(gòu)例5-4:CREATETABLEtest_exa(column_aINT)GOALTERTABLEtest_exa
ADDcolumn_bVARCHAR(20)NULLGOEXECsp_helptest_exaGODROPTABLEtest_exaGO例5-5:CREATETABLEtest_exb(column_aINT,column_bVARCHAR(20)NULL)GOALTERTABLE
test_exbDROPCOLUMN
column_b
GOEXECsp_helptest_exbGODROPTABLEtest_exbGO用ALTERTABLE命令修改表結(jié)構(gòu)的基本語(yǔ)法:ALTERTABLE
table{
[
ALTERCOLUMN
column_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|DISABLE}
TRIGGER
{ALL|trigger_name[,...n]}}用管理控制臺(tái)修改表結(jié)構(gòu)用存儲(chǔ)過(guò)程sp_rename修改表名和列名
sp_rename存儲(chǔ)過(guò)程可以修改當(dāng)前數(shù)據(jù)庫(kù)中用戶對(duì)象的名稱,如表、列、索引、存儲(chǔ)過(guò)程等。其語(yǔ)法如下:sp_rename
[@objname=]‘object_name’,[@newname=]‘new_name’[,[@objtype=]‘object_type’]
例5-6:更改toys表的名稱為toy。execsp_rename‘toys’,‘toy’例5-7:更改toy表的列vtoyname名稱為name。execsp_rename‘toy.[vtoyname]’,‘name’,
‘column’5.2.3表結(jié)構(gòu)的刪除用DROPTABLE命令刪除表用管理控制臺(tái)刪除表DROPTABLE命令的語(yǔ)法如下:
DROPTABLE
table_name
注意:在刪除一個(gè)表之前要先刪除與此表相關(guān)聯(lián)的表中的外關(guān)鍵字約束。當(dāng)刪除表后,綁定的規(guī)則或缺省值會(huì)自動(dòng)松綁。用DROPTABLE命令刪除表用管理控制臺(tái)刪除表5.3表中數(shù)據(jù)的修改5.3.1數(shù)據(jù)的插入5.3.2數(shù)據(jù)的更新5.3.3數(shù)據(jù)的刪除5.3.1數(shù)據(jù)的插入1.INSERT語(yǔ)句2.SELECTINTO語(yǔ)句3.INSERT…SELECT語(yǔ)句INSERT語(yǔ)句語(yǔ)法如下:INSERT[INTO]表名[列列表]VALUES缺省值|值列表|select語(yǔ)句
表5.3表Sales的結(jié)構(gòu)如果需要將一行中所有的列值插入表Sales,使用如下語(yǔ)句:
INSERT
SalesVALUES(‘I005’,‘Printer’,100,‘2005-2-11’)如果需要將在INSERT子句中指定列名的行插入到表Sales中,使用如下語(yǔ)句:
INSERT
Sales
(cItemCode,cItemName,iQtySold,SaleDate)
VALUES
(‘I005’,‘Printer’,100,‘2005-2-11’)
如果需要將一行插入到表Sales中,插入時(shí)在INSERT和VALUES子句中指定列次序和列值,使用如下語(yǔ)句:
INSERT
Sales
(cItemName,cItemCode,iQtySold,dSaleDate)
VALUES
(‘Printer’,‘I005’,100,‘2005-2-11’)如果需要將一行插入到表Sales中,插入時(shí)不指定列cItemName中的項(xiàng)目名稱值,使用如下語(yǔ)句:
INSERT
SalesVALUES
(‘I005’,
NULL,100,‘2005-2-11’)
如果需要將一行插入到表Sales中,插入時(shí)為列dSaleDate指定缺省值,使用的語(yǔ)句如下:INSERT
SalesVALUES
(‘I005’,‘Printer’,100,
DEFAULT)
提示:
數(shù)值個(gè)數(shù)必須和表中或列列表中的屬性個(gè)數(shù)相同。
插入信息的次序必須和插入列表中列出的屬性次序相同。信息的數(shù)據(jù)類型必須和列表中的數(shù)據(jù)類型匹配。當(dāng)插入VARBINARY類型的數(shù)據(jù)時(shí),其尾部的“0”將被去掉。當(dāng)插入VARCHAR或TEXT類型的數(shù)據(jù)時(shí),其后的空格將被去掉;如果插入一個(gè)只含空格的字符串,則會(huì)被認(rèn)為插入了一個(gè)長(zhǎng)度為零的字符串。
IDENTITY列不能指定數(shù)據(jù),在VALUES列表中應(yīng)跳過(guò)此列。
對(duì)字符類型的列,當(dāng)插入數(shù)據(jù),特別是插入字符串中含有數(shù)字字符以外的字符時(shí),最好用引號(hào)將其括起來(lái),否則容易出錯(cuò)。SELECTINTO語(yǔ)句
SELECTINTO語(yǔ)句創(chuàng)建一個(gè)新表,并用SELECT的結(jié)果集填充該表。語(yǔ)法如下:SELECT列列表
INTO新表名
FROM表名WHERE條件
例5-8:根據(jù)表Titles創(chuàng)建一個(gè)叫NewTitles的新表,該表包括兩列。
USEPubsGOSELECTtitle_id,titleINTONewTitles
FROMTitlesWHEREPrice>15INSERT…SELECT語(yǔ)句
使用該命令,可以從一個(gè)表向另一個(gè)已經(jīng)存在的表添加數(shù)據(jù)。語(yǔ)法如下:
INSERT[INTO]表名1
SELECT列名FROM表名2[WHERE條件]例5-9:將表OldItems中的所有屬性、所有行插入表Items。INSERTINTOItems
SELECT*FROMOldItems5.3.2數(shù)據(jù)的更新
SQLServer提供了UPDATE語(yǔ)句來(lái)進(jìn)行數(shù)據(jù)的修改。數(shù)據(jù)的更新確保了任何時(shí)候都可以獲得最新、最正確的信息,一行中的一欄是更新的最小單元。
語(yǔ)法如下:
UPDATE表名
SET列名=值[,列名=值…]
[WHERE條件]表5.4表Items樣例cItemCode為‘I003’的物品的iQOH屬性的值增加了100UPDATEItemsSETiQOH=iQOH+100WHEREcItemCode=‘I003’例如,如果要增加表Items中所有物品的價(jià)格,代碼如下:
UPDATEItems
SETiPrice=iPrice+0.05提示:同一時(shí)刻只能對(duì)一張表進(jìn)行更新。
例5-10:使由NewMoonBooks出版的所有書(shū)籍的價(jià)格加倍。該查詢更新titles表,其子查詢引用publishers表。
titlespublishersUPDATE
titles
SET
price=price*2
WHEREpub_id
IN(SELECTpub_idFROMpublishersWHEREpub_name=‘NewMoonBooks’)5.3.3數(shù)據(jù)的刪除例如,如果想從表5.4的Items中刪除物品“Keyboards”,應(yīng)給出的命令:
DELETE
Items
WHEREItemCode=‘I002’
語(yǔ)法如下:
DELETE[FROM]表名
[WHERE條件]
有時(shí)候,要?jiǎng)h除一個(gè)表的所有數(shù)據(jù)使它成為空表,只需不帶條件即可。
例如,刪除玩具(Toys)表中所有的記錄:
DELETEFROMToys
例5-11:刪除商業(yè)書(shū)籍的所有銷(xiāo)售記錄。titlessalesUSEPubsGODELETEsalesWHEREtitle_idIN(SELECTtitle_idFROMtitles
WHEREtype=‘business’
)5.4數(shù)據(jù)的完整性5.4.1數(shù)據(jù)完整性的概述5.4.2約束5.4.3規(guī)則5.4.4默認(rèn)值5.4.1數(shù)據(jù)完整性概述1.數(shù)據(jù)完整性的概念2.實(shí)現(xiàn)數(shù)據(jù)完整性的方法3.完整性約束條件的作用對(duì)象1.數(shù)據(jù)完整性的概念
數(shù)據(jù)完整性是指數(shù)據(jù)的精確性和可靠性;
加在數(shù)據(jù)庫(kù)數(shù)據(jù)之上的語(yǔ)義檢查條件就稱為數(shù)據(jù)完整性約束條件;
DBMS檢查數(shù)據(jù)是否滿足完整性條件的機(jī)制就稱為完整性檢查。數(shù)據(jù)完整性分為四類:實(shí)體完整性、域完整性、引用完整性和用戶自定義的完整性。
實(shí)體完整性指的是關(guān)系數(shù)據(jù)庫(kù)中所有的表都必須有主鍵,而且表中不允許存在如下的記錄:無(wú)主鍵值的記錄;主鍵值相同的記錄;即表的每一行的記錄的值在表中是唯一的。實(shí)體完整性域完整性又稱為語(yǔ)義完整性,它確保只有在某一合法范圍內(nèi)的值才能存儲(chǔ)到一列中??梢酝ㄟ^(guò)限制數(shù)據(jù)類型、值的范圍和數(shù)據(jù)格式來(lái)實(shí)施域完整性。例如,人的年齡的取值范圍為0~150。域完整性
引用完整性有時(shí)也稱為參照完整性,是指兩個(gè)表的主關(guān)鍵字和外部關(guān)鍵字的數(shù)據(jù)應(yīng)對(duì)應(yīng)一致,即限制一個(gè)表中某列的取值受另一個(gè)表的某列的取值范圍約束。
它是建立在外部關(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)鍵字值改變;禁止刪除在從表中的有對(duì)應(yīng)記錄的主表記錄。
用戶自定義完整性是針對(duì)某一具體應(yīng)用領(lǐng)域定義的數(shù)據(jù)約束條件,反應(yīng)某一具體應(yīng)用所涉及的數(shù)據(jù)必須要滿足應(yīng)用語(yǔ)義的要求。用戶自定義完整性2.實(shí)現(xiàn)數(shù)據(jù)完整性的方法
實(shí)現(xiàn)數(shù)據(jù)完整性既可以在客戶端完成,又可以在服務(wù)器端完成。在客戶端實(shí)現(xiàn)數(shù)據(jù)完整性主要使用數(shù)據(jù)庫(kù)前端開(kāi)發(fā)工具(如.net,Delphi等),在應(yīng)用程序中編寫(xiě)代碼來(lái)保證。在服務(wù)器端實(shí)現(xiàn)數(shù)據(jù)完整性的方法主要有兩種:一是在定義表時(shí)聲明數(shù)據(jù)完整性,另一種是在服務(wù)器端通過(guò)觸發(fā)器來(lái)實(shí)現(xiàn)。3.完整性約束條件的作用對(duì)象
完整性約束條件的作用對(duì)象可以是列、行和表對(duì)數(shù)據(jù)類型的約束:包括數(shù)據(jù)類型、長(zhǎng)度、精度等。例如性別的數(shù)據(jù)類型為字符型,長(zhǎng)度為1。對(duì)數(shù)據(jù)格式的約束:如規(guī)定身份證號(hào)碼。對(duì)取值范圍或取值集合的約束:如人的年齡取值范圍為0~150,玩具的重量應(yīng)該大于0等。對(duì)空值的約束:有些字段允許為空(比如購(gòu)買(mǎi)數(shù)),有些列則不允許為空(比如玩具名),在定義字段時(shí)應(yīng)指明其是否允許取空值。字段(列)級(jí)約束
行的約束是行中各個(gè)字段之間的聯(lián)系的約束。
如開(kāi)始日期小于結(jié)束日期,訂貨數(shù)量小于等于庫(kù)存數(shù)量,職工的最低工資不能低于國(guó)家規(guī)定的最低值等。行(元祖)級(jí)約束表(關(guān)系)級(jí)約束
表約束是指若干行之間、表之間的聯(lián)系的約束。
比如玩具ID的取值不能重復(fù)也不能取空值,購(gòu)物者購(gòu)買(mǎi)玩具的ID號(hào)的取值受玩具表中玩具ID取值的限制等。5.4.2約束約束是MicrosoftSQLServer提供的自動(dòng)保持?jǐn)?shù)據(jù)庫(kù)完整性的一種方法,定義了可輸入表或表的單個(gè)列中的數(shù)據(jù)的限制條件。
在SQLServer中有5種約束:主關(guān)鍵字約束、外關(guān)鍵字約束、唯一性約束、檢查約束和缺省約束。
此外,本節(jié)還將介紹在管理控制臺(tái)中如何創(chuàng)建約束以及系統(tǒng)對(duì)約束的檢查。主關(guān)鍵字約束--確保實(shí)體完整性
主關(guān)鍵字約束(簡(jiǎn)稱主鍵約束)指定表的一列或幾列的組合的值在表中具有唯一性,即能唯一地指定一行記錄。
每個(gè)表中只能有一列被指定為主關(guān)鍵字;
且IMAGE和TEXT類型的字段都不能被指定為主關(guān)鍵字;
也不允許指定主關(guān)鍵字列有NULL屬性。
當(dāng)定義主鍵約束時(shí),需要指定約束名。
如果將主鍵約束定義在一個(gè)已經(jīng)包含數(shù)據(jù)的列上,那么,該列中已經(jīng)存在的數(shù)據(jù)將被檢查。如果發(fā)現(xiàn)了任何重復(fù)的值,那么主鍵約束將被拒絕。語(yǔ)法如下:CONSTRAINT
constraint_namePRIMARYKEY
[CLUSTERED|NONCLUSTERED](column_name1[,column_name2,…,column_name16])例5-11:創(chuàng)建訂單表(Oders),訂單編號(hào)(cOderNo)為主鍵。
CREATETABLEOrders(
cOrderNoCHAR(6)CONSTRAINTpkcOrderNoPRIMARYKEYCLUSTERED,…)
也可以在表創(chuàng)建完畢之后創(chuàng)建主關(guān)鍵字,命令如下:ALTERTABLEOrdersADDCONSTRAINTpkcOrderNo
PRIMARYKEYCLUSTERED(cOrderNo)例5-13:創(chuàng)建訂單細(xì)節(jié)表(OrderDetail),訂單編號(hào)(cOrderNo)和玩具ID(cToyId)為復(fù)合主鍵。CREATETABLEOrderDetail(cOrderNoCHAR(6)NOTNULL,…
CONSTRAINT
pkOrderDetailPRIMARYKEY
(cOrderNo,cToyId))外關(guān)鍵字約束--確保引用完整性
外關(guān)鍵字約束定義了表之間的關(guān)系。這樣,當(dāng)在定義主關(guān)鍵字約束的表中更新列值,其他表中有與之相關(guān)聯(lián)的外關(guān)鍵字約束的表中的外關(guān)鍵字列也將被相應(yīng)的做相同的更新(前提是設(shè)置了級(jí)聯(lián)更新)。當(dāng)向有外關(guān)鍵字的表中插入數(shù)據(jù)時(shí),如果與之相關(guān)聯(lián)的表的列中沒(méi)有與插入的外關(guān)鍵字列值相同的值時(shí),系統(tǒng)會(huì)拒絕插入數(shù)據(jù)。不能使用IMAGE或TEXT數(shù)據(jù)類型的列創(chuàng)建外關(guān)鍵字CONSTRAINT
constraint_nameFOREIGNKEY
(column_name1[,column_name2,…,column_name16])REFERENCESref_table
[(ref_column1[,ref_column2,…,ref_column16])][ONDELETE
{CASCADE|NOACTION}][ONUPDATE
{CASCADE|NOACTION}][NOTFORREPLICATION]CREATETABLEOrderDetail(cOrderNoCHAR(6)
REFERENCES
Orders(cOrderNo),cToyIdCHAR(6)NOTNULL,…
CONSTRAINTpkOrderDetail
PRIMARYKEY
(cOrderNo,cToyId),FOREIGNKEY
(cToyId)
REFERENCES
Toys(cToyId)
)例5-14:創(chuàng)建訂單細(xì)節(jié)表(OrderDetail),訂單編號(hào)
(cOrderNo)和玩具ID(cToyId)為復(fù)合主鍵,同時(shí)它們
又是外鍵,與訂單表的訂單編號(hào)、玩具表的玩具ID相關(guān)聯(lián)。ALTERTABLEOrderDetailADD
CONSTRAINT
fkOrderNoFOREIGNKEY
(cOrderNo)REFERENCES
Orders(cOrderNo)ALTERTABLEOrderDetailADD
CONSTRAINT
fkToyIdFOREIGNKEY
(cToyId)REFERENCES
Toys(cToyId)唯一性約束
唯一性約束指定一個(gè)或多個(gè)列的組合的值具有唯一性,以防止在列中輸入重復(fù)的值。
唯一性約束指定的列可以有NULL屬性。
由于主關(guān)鍵字值是具有唯一性的,因此,主關(guān)鍵字列不能再設(shè)定唯一性約束。
唯一性約束最多由16個(gè)列組成。創(chuàng)建UNIQUE約束有關(guān)的規(guī)則如下:它可以創(chuàng)建在列級(jí),也可以創(chuàng)建在表級(jí);它不允許一個(gè)表中有兩行取相同的非空值;一個(gè)表中可以有多個(gè)UNIQUE約束;即使指定了WITHNOCHECK選項(xiàng),也不能阻止根據(jù)約束對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行的檢查。語(yǔ)法如下:CONSTRAINT
constraint_nameUNIQUE
[CLUSTERED|NONCLUSTERED](column_name1[,column_name2,…,column_name16])例5-15:創(chuàng)建國(guó)家表(Country),指定國(guó)家不能重復(fù),ID號(hào)為主鍵。CREATETABLECountry(cCountryIdCHAR(3)
PRIMARYKEY,
/*省略部分關(guān)鍵字,行級(jí)約束,沒(méi)有指定約束名*/
cCountryCHAR(25)NOTNULL
UNIQUE
/*行級(jí)約束,沒(méi)有指定約束名*/)也可以在表格創(chuàng)建完畢后,通過(guò)改變表格來(lái)創(chuàng)建UNIQUE約束。ALTERTABLECountryADD
CONSTRAINT
unqCountry
UNIQUE
(cCountry)/*表級(jí)約束*/檢查約束----確保域完整性
檢查約束通過(guò)限制插入列中的值來(lái)實(shí)施域完整性??梢栽谝涣猩隙x多個(gè)檢查約束,它們按照定義的次序被實(shí)施。
當(dāng)約束被定義成表級(jí)時(shí),單一的檢查約束可以被應(yīng)用到多列。語(yǔ)法如下:CONSTRAINTconstraint_nameCHECK
[NOTFORREPLICATION](logical_expression)IN關(guān)鍵字
----確保鍵入的值被限制在一個(gè)常數(shù)表達(dá)式列表中
例如:在表Shopper的列cCity上創(chuàng)建了CHECK約束chkCity,這樣就能將輸入限制在合法的城市中。CREATETABLEShopper(…cCityCHAR(15)NOTNULL
CONSTRAINT
chkCity
CHECK
(cCity
IN(‘Boston’,‘Chicago’,‘Dallas’,‘NewYork’,‘Paris’,‘Washington’))…)LIKE關(guān)鍵字
----可以通過(guò)通配符來(lái)確保鍵入某一列的值符合一定的模式例如:CHECK
(cShopperId
LIKE
‘[0-9][0-9][0-9][0-9][0-9][0-9]’)
上述CHECK約束指定了一個(gè)六位數(shù)值,每一位的取值為[0-9]。BETWEEN關(guān)鍵字
----指明常數(shù)表達(dá)式的范圍,該范圍包括上限值和下限值例如:
CHECK
(siToyQoh
BETWEEN
0AND100)上述CHECK約束指定了屬性siToyQoh的值只能在0~100之間。創(chuàng)建CHECK約束時(shí)應(yīng)遵循的規(guī)則它可以在列級(jí)或表級(jí)創(chuàng)建;它用來(lái)限制可以插入到該列的值;它可以包含用戶自定義的搜素條件;它不能包含子查詢;如果創(chuàng)建時(shí)指定了WITHNOCHECK選項(xiàng),就不檢查已有數(shù)據(jù);它可以引用同一表中的其他列。例5-16:創(chuàng)建購(gòu)物者表(Shopper),把購(gòu)物者的城市限定在Boston、Chicago、Dallas、NewYork、Paris、Washington這幾個(gè)城市中。CREATETABLEShopper(…cCityCHAR(15)NOTNULL
CONSTRAINTchkCity
CHECK
(cCity
IN
(‘Boston’,‘Chicago’,‘Dallas’,‘NewYork’,‘Paris’,‘Washington’))…)ALTERTABLEShopperADD
CONSTRATINTchkCity
CHECK(cCity
IN
(‘Boston’,‘Chicago’,‘Dallas’,‘NewYork’,‘Paris’,‘Washington’))
注意:對(duì)計(jì)算列不能做除檢查約束外的任何約束。缺省約束
可用于為某列指定一個(gè)常數(shù)值,這樣用戶就不需要為該列插入值。只能在一列上創(chuàng)建一個(gè)缺省約束,且該列不能是IDENTITY列。
缺省約束通過(guò)定義列的默認(rèn)值或使用數(shù)據(jù)庫(kù)的默認(rèn)值對(duì)象綁定表的列,來(lái)指定列的默認(rèn)值。SQLServer推薦使用缺省約束,而不使用默認(rèn)值的方式來(lái)指定列的默認(rèn)值。語(yǔ)法如下:CONSTRAINT
constraint_nameDEFAULT
constant_expression[FORcolumn_name]例5-17:在Shopper的cCity屬性上創(chuàng)建DEFAULT約束。如果沒(méi)有指定城市,則屬性cCity將缺省的包含“Chicago”。CREATETABLEShopper(…cCityCHAR(15)DEFAULT‘Chicago’…)如果表已經(jīng)創(chuàng)建,但沒(méi)有指定缺省值,則可以用ALTERTABLE命令來(lái)指定缺省值。ALTERTABLEShopperADD
CONSTRAINTdefCityDEFAULT
‘Chicago’FORcCity在管理控制臺(tái)中創(chuàng)建約束系統(tǒng)對(duì)約束的檢查1.主鍵約束對(duì)于主鍵約束,每當(dāng)用戶執(zhí)行插入數(shù)據(jù)時(shí),系統(tǒng)檢查新插入的數(shù)據(jù)的主鍵值是否與已存在的主鍵值重復(fù),或者新插入的主鍵值是否為空。當(dāng)用戶執(zhí)行修改有主鍵約束的列時(shí),系統(tǒng)檢查修改后的主鍵值是否與表中的主鍵值重復(fù),或者修改后的主鍵值是否有空值。只有當(dāng)新插入數(shù)據(jù)或者修改后的主鍵值滿足不重復(fù)、不空時(shí),系統(tǒng)才進(jìn)行插入和修改操作,否則出錯(cuò)。2.外鍵約束當(dāng)在子表中插入數(shù)據(jù)時(shí),檢查新插入數(shù)據(jù)的外鍵值是否在主表的主鍵值范圍內(nèi),若在主鍵值范圍內(nèi),則插入,否則失敗。當(dāng)在子表中修改外鍵列的值時(shí),檢查修改后的外鍵值是否在主表的主鍵值范圍內(nèi),若在主鍵值范圍內(nèi),則進(jìn)行修改,否則失敗。當(dāng)在主表中刪除數(shù)據(jù)時(shí),檢查被刪除數(shù)據(jù)的主鍵值是否在子表中有對(duì)它的引用,若沒(méi)有對(duì)它的引用,則刪除之。若有,則看是否允許級(jí)聯(lián)刪除,若允許級(jí)聯(lián)刪除,則將子表中外鍵值等于被刪除數(shù)據(jù)的主鍵值的記錄一起刪掉;若不允許級(jí)聯(lián)刪除,則刪除失敗。當(dāng)更改主表中的主鍵列的值時(shí),檢查被更改的主鍵值是否在子表中有對(duì)它的引用,若沒(méi)有對(duì)它的引用,則更改之。若有,則看是否允許級(jí)聯(lián)更改,若允許級(jí)聯(lián)更改,則將子表中外鍵值等于被刪除數(shù)據(jù)的主鍵值的記錄的外鍵一起更改;若不允許級(jí)聯(lián)更改,則更改失敗。3.唯一性約束
對(duì)唯一性約束的檢查與主鍵很類似,只是在檢查有唯一值約束的列時(shí),系統(tǒng)只需檢查新插入數(shù)據(jù)或者更改后的有唯一值約束的列的值是否與表中已有數(shù)據(jù)有重復(fù),而不檢查是否有空值。只要新插入數(shù)據(jù)或者更改后的值滿足不重復(fù)這個(gè)條件,即可進(jìn)行操作。4.檢查約束
檢查約束與唯一性約束類似。當(dāng)用戶插入數(shù)據(jù)或修改有列取值約束的數(shù)據(jù)時(shí),系統(tǒng)檢查新插入的值或更改后的值是否符合列檢查(取值范圍)約束,若符合,則執(zhí)行插入或修改操作,否則拒絕操作。5.缺省約束缺省約束是指當(dāng)用戶對(duì)數(shù)據(jù)進(jìn)行插入操作并且沒(méi)有為某個(gè)列提供值時(shí),系統(tǒng)檢查省略值的列是否有默認(rèn)值約束,若有,則插入默認(rèn)值;若無(wú),則系統(tǒng)檢查此列是否允許為空,若允許,則插入空值,否則出錯(cuò)。提示:這幾種約束的共同點(diǎn)是在對(duì)數(shù)據(jù)操作之前,先檢查約束,只有當(dāng)滿足約束條件時(shí)才進(jìn)行操作。5.4.3規(guī)則
規(guī)則(Rule)就是數(shù)據(jù)庫(kù)中對(duì)存儲(chǔ)在表的列或用戶定義數(shù)據(jù)類型中的值的規(guī)定和限制。規(guī)則是單獨(dú)存儲(chǔ)的獨(dú)立的數(shù)據(jù)庫(kù)對(duì)象。
規(guī)則提供了對(duì)列和用戶自定義數(shù)據(jù)類型實(shí)施域完整性的一種機(jī)制。規(guī)則在INSERT或UPDATE語(yǔ)句執(zhí)行之前被應(yīng)用,即規(guī)則指定了對(duì)列和用戶自定義數(shù)據(jù)類型的值的限制。1.創(chuàng)建規(guī)則2.查看規(guī)則3.規(guī)則的綁定與松綁4.刪除規(guī)則1.創(chuàng)建規(guī)則
CREATERULE命令用于在當(dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建規(guī)則,其語(yǔ)法如下:CREATERULE
rule_name
AS
condition_expression
注意:condition_expression子句中的表達(dá)式必須以字符“@”開(kāi)頭。用CREATERULE命令創(chuàng)建規(guī)則例子說(shuō)明CREATERULErulDeptNameAS
@DeptName
NOTIN(‘a(chǎn)ccounts’,‘stores’)表明了如果要向規(guī)則綁定的列或用戶自定義數(shù)據(jù)類型中插入值‘a(chǎn)ccounts’或‘stores’,這些值將被拒絕CREATERULErulMaxPriceAS@MaxPrice>=$5000允許$5000或更大的值插入到該規(guī)則綁定的列或用戶自定義數(shù)據(jù)類型中CREATERULErulEmpCodeAS@EmpCode
LIKE‘[F-M][A-Z]_’允許符合LIKE子句中指定形式的字符串被插入到規(guī)則綁定的列中或用戶自定義數(shù)據(jù)類型中在一個(gè)時(shí)刻,只有一條規(guī)則可以綁定到某列或某個(gè)用戶自定義數(shù)據(jù)類型上。如果一條規(guī)則被綁定到某用戶自定義數(shù)據(jù)類型上,它并不會(huì)替代綁定到該數(shù)據(jù)類型的列上的規(guī)則。如果一條新的規(guī)則綁定到某列或某數(shù)據(jù)類型上,而該列或類型上已經(jīng)綁定了一條規(guī)則,那么,新規(guī)則將替代舊規(guī)則。規(guī)則不會(huì)應(yīng)用到已經(jīng)插入表中的數(shù)據(jù),表中現(xiàn)有的值不一定要符合規(guī)則指定的標(biāo)準(zhǔn)。不能為系統(tǒng)定義的數(shù)據(jù)類型定義規(guī)則。使用規(guī)則的限制2.查看規(guī)則語(yǔ)法如下:sp_helptext[@objname=]‘name’例如,execsp_helptext‘rulsex’------查看新建的rulsex規(guī)則3.規(guī)則的綁定與松綁
所謂綁定,是指定規(guī)則作用于哪個(gè)表的哪一列或哪一個(gè)用戶自定義數(shù)據(jù)類型。表的一列或一個(gè)用戶自定義數(shù)據(jù)類型只能與一個(gè)規(guī)則相綁定,而一個(gè)規(guī)則可以綁定多個(gè)對(duì)象,這正是規(guī)則的魅力所在。
解除規(guī)則與對(duì)象的綁定稱為“松綁”。
存儲(chǔ)過(guò)程sp_bindrule可以綁定一個(gè)規(guī)則到表的一個(gè)列或一個(gè)用戶自定義數(shù)據(jù)類型上。其語(yǔ)法如下:sp_bindrule[@rulename=]‘rule’,[@objname=]‘object_name’[,‘futureonly’]例5-18:綁定規(guī)則rulsex到表student的sex列上。execsp_bindrule'rulsex','student.sex'與表的列綁定的規(guī)則優(yōu)先于與用戶自定義數(shù)據(jù)類型綁定的規(guī)則,因此,如果表的列的數(shù)據(jù)類型與規(guī)則A綁定,同時(shí)列又與規(guī)則B綁定,則以規(guī)則B為列的規(guī)則??梢灾苯佑靡粋€(gè)新的規(guī)則來(lái)綁定列或用戶自定義數(shù)據(jù)類型,而不需要先將其原來(lái)綁定的規(guī)則解除,系統(tǒng)會(huì)將原來(lái)的規(guī)則覆蓋。語(yǔ)法如下:sp_unbindrule[@objname=]‘object_name’[,‘futureonly’]例5-19:解除規(guī)則rulsex與表student中列sex的綁定,帶‘futureonly’選項(xiàng)。execsp_unbindrule‘student.sex’,‘futureonly’4.刪除規(guī)則語(yǔ)法如下:
DROPRULE
{
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉(cāng)庫(kù)招聘合同范本
- 加工車(chē)庫(kù)門(mén)窗合同范本
- 勞務(wù)合同租賃合同范本
- 個(gè)人單位用人合同范本
- 單位購(gòu)車(chē)職工使用合同范本
- 刮瓷墻面修補(bǔ)合同范本
- 冷庫(kù)搬運(yùn)服務(wù)合同范本
- 業(yè)主瓷磚采購(gòu)合同范本
- 企業(yè)知識(shí)保護(hù)合同范本
- 包船運(yùn)輸貨物合同范本
- 《網(wǎng)店運(yùn)營(yíng)與管理》整本書(shū)電子教案全套教學(xué)教案
- 打印版 《固體物理教程》課后答案王矜奉
- CAD術(shù)語(yǔ)對(duì)照表
- 學(xué)術(shù)論文的寫(xiě)作與規(guī)范課件
- 香港牛津新魔法Newmagic3AUnit4Mycalendar單元檢測(cè)試卷
- 中考《紅星照耀中國(guó)》各篇章練習(xí)題及答案(1-12)
- Q∕GDW 11612.43-2018 低壓電力線高速載波通信互聯(lián)互通技術(shù)規(guī)范 第4-3部分:應(yīng)用層通信協(xié)議
- 自動(dòng)化物料編碼規(guī)則
- 第1本書(shū)出體旅程journeys out of the body精教版2003版
- [英語(yǔ)考試]同等學(xué)力英語(yǔ)新大綱全部詞匯
- 最簡(jiǎn)易的帕累托圖制作方法簡(jiǎn)介PPT課件
評(píng)論
0/150
提交評(píng)論