版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
引入數(shù)據(jù)完整性(DataIntegrity)是指存儲在數(shù)據(jù)庫中的數(shù)據(jù),應(yīng)該保持一致性和可靠性。在輸入數(shù)據(jù)時,由于不可避免的種種原因,會發(fā)生輸入無效或錯誤信息。如何保持輸入的數(shù)據(jù)符合規(guī)定,是數(shù)據(jù)庫系統(tǒng),尤其是多用戶的關(guān)系數(shù)據(jù)庫系統(tǒng)首要關(guān)注的問題。7/22/20231SQL數(shù)據(jù)完整性學(xué)習(xí)目標默認(Default)規(guī)則(Rull)約束(Constraint)學(xué)習(xí)完本課程,您應(yīng)該能夠:7/22/20232SQL數(shù)據(jù)完整性知識重、難點分析重點:默認(Default)規(guī)則(Rull)和結(jié)構(gòu)的修改難點:
約束(Constraint)7/22/20233SQL數(shù)據(jù)完整性數(shù)據(jù)完整性
數(shù)據(jù)完整性是用來確保數(shù)據(jù)庫中的數(shù)據(jù)的正確性和可靠性。實體完整性:實體完整性是為了保證表中的數(shù)據(jù)唯一,實體完整性可由主鍵來實現(xiàn)。表中的主鍵在所有記錄上的取值必須唯一。域完整性:域完整性可以保證數(shù)據(jù)的取值在有效的范圍內(nèi)。參照完整性:參照完整性用于確保相關(guān)聯(lián)的表間的數(shù)據(jù)應(yīng)保持一致,避免因一個表的記錄修改,造成另一個表的內(nèi)容變?yōu)闊o效的值。一般來說,參照完整性是通過外鍵和主鍵來維護的。自定義完整性:由用戶自行定義的,不同于前面3種的完整性,也可以說一種強制數(shù)據(jù)定義。7/22/20234SQL數(shù)據(jù)完整性任務(wù)一約束7/22/20235SQL數(shù)據(jù)完整性約束類型功能說明primarykey保證主鍵的實體完整性主鍵的值不能有重復(fù)值,且不為null。使用時,往往在其上建立索引,以提高數(shù)據(jù)庫的性能。unique保證非主鍵的實體完整性非主鍵(即非主關(guān)鍵字)的值不能有重復(fù)值。foreignkey保證參照完整性一個表中的值,須參照另外一個表中的主鍵值。check域完整性字段可以取值的范圍。default域完整性為字段賦予特定的值。Notnull實體完整性非空約束。約束限制了用戶可能輸入到表或字段中的值。7/22/20236SQL數(shù)據(jù)完整性
一約束的定義
在SQLServer系統(tǒng)中,約束的定義主要是通過createtable語句或altertable語句來實現(xiàn)的。
使用createtable語句,是在建立新表的同時定義了約束。使用altertable語句,是向已經(jīng)存在的表中添加約束。約束可以是字段級約束,也可以是表級約束。字段級約束是把約束放在某個字段列上的,且約束僅對該字段列起作用,表級約束是把約束放在表中的多個字段列上。7/22/20237SQL數(shù)據(jù)完整性1、使用createtable語句創(chuàng)建約束
createtabletable_name(column_namedata_type[defaultconstraint_expression][<table_constraint>::=[constraintconstraint_name]{[null|notnull]|[{primarykey|unique}[clustered|nonclustered]]|[foreignkey]referencesref_table[(ref_column)]|check[notforreplication]}][,…n])7/22/20238SQL數(shù)據(jù)完整性2、使用altertable語句創(chuàng)建約束
altertabletable_name{add{<column_constraint>::=[constraintconstraint_name]{[null|notnull]|[{primarykey|unique}]|[foreignkey]referencesref_table[(ref_column)]|defaultconstant_expression|check(logical_expression)}}[,…n]|drop{[constraint]constraint_name|columncolumn}[,…n]}7/22/20239SQL數(shù)據(jù)完整性
二primarykey約束在關(guān)系數(shù)據(jù)庫中,每個表都有一個能夠唯一地標識表中每一行(實體)的字段,即主碼或稱為主關(guān)鍵字。數(shù)據(jù)庫系統(tǒng)是通過主碼來保證表的實體完整性。
primarykey約束,反映了定義為主碼的字段的取值不能重復(fù),且不能取null值。創(chuàng)建primarykey約束時,SQLServer會自動創(chuàng)建一個唯一的簇索引。
7/22/202310SQL數(shù)據(jù)完整性1、使用企業(yè)管理器創(chuàng)建primarykey約束7/22/202311SQL數(shù)據(jù)完整性
2、使用查詢分析器創(chuàng)建primarykey約束例:創(chuàng)建列級主鍵約束,無約束名。
use學(xué)生管理數(shù)據(jù)庫gocreatetable學(xué)生表1(學(xué)號varchar(9)notnullprimarykey,姓名varchar(8),性別varchar(2),年齡tinyint,所在院系varchar(10),班級名varchar(10),入學(xué)年份datetime)7/22/202312SQL數(shù)據(jù)完整性
例:創(chuàng)建列級主鍵約束,有約束名。
use學(xué)生管理數(shù)據(jù)庫gocreatetable學(xué)生表2(學(xué)號varchar(9)
constraintpk_學(xué)號notnullprimarykey,姓名varchar(8),性別varchar(2),年齡tinyint,所在院系varchar(10),班級名varchar(10),入學(xué)年份datetime,)2、使用查詢分析器創(chuàng)建primarykey約束7/22/202313SQL數(shù)據(jù)完整性
例:創(chuàng)建列級主鍵約束,有約束名。
use學(xué)生管理數(shù)據(jù)庫gocreatetable學(xué)生表2(學(xué)號varchar(9),姓名varchar(8),性別varchar(2),年齡tinyint,所在院系varchar(10),班級名varchar(10),入學(xué)年份datetime,
constraintpk_學(xué)號notnullprimarykey(學(xué)號))2、使用查詢分析器創(chuàng)建primarykey約束7/22/202314SQL數(shù)據(jù)完整性
例:向表添加列級主鍵約束,有約束名。
use學(xué)生管理數(shù)據(jù)庫goaltertable學(xué)生表2addconstraintpk_學(xué)號primarykey(學(xué)號)3、使用查詢分析器創(chuàng)建primarykey約束7/22/202315SQL數(shù)據(jù)完整性
三unique約束unique約束對某個字段列提供了實體完整性。
unique約束主要用在非主鍵的列上限制數(shù)據(jù)的唯一。按照unique約束的要求,在一個表中不允許任意兩行在被約束的字段列上有相同的非空值。一個表可以有多個unique約束。7/22/202316SQL數(shù)據(jù)完整性1、使用企業(yè)管理器創(chuàng)建unique約束7/22/202317SQL數(shù)據(jù)完整性例:創(chuàng)建列級唯一約束,無約束名。
use學(xué)生管理數(shù)據(jù)庫gocreatetable課程表3(課程號varchar(4)notnullprimarykey,課程名varchar(12)unique,先修課varchar(4),)2、使用查詢分析器創(chuàng)建unique約束7/22/202318SQL數(shù)據(jù)完整性例:創(chuàng)建列級唯一約束,有約束名。
use學(xué)生管理數(shù)據(jù)庫gocreatetable課程表3(課程號varchar(4)notnullprimarykey,課程名varchar(12),先修課varchar(4),
constraintu_課程名unique(課程名))2、使用查詢分析器創(chuàng)建unique約束7/22/202319SQL數(shù)據(jù)完整性
例:向表添加列級唯一約束,有約束名。
use學(xué)生管理數(shù)據(jù)庫goaltertable課程表3addconstraintu_課程名unique(課程名)3、使用查詢分析器創(chuàng)建unique約束7/22/202320SQL數(shù)據(jù)完整性
四foreignkey約束
外碼(外關(guān)鍵字)是說明某列的取值必須參照另外表的主碼值。一個外碼是一個表的主碼并且是另一個表的外碼。外碼提供了兩個表之間的連接。外碼通過強制外碼字段的取值必須是另外表中主碼字段的有效值,來實施參照完整性。
7/22/202321SQL數(shù)據(jù)完整性
1、使用企業(yè)管理器創(chuàng)建foreignkey約束7/22/202322SQL數(shù)據(jù)完整性
use學(xué)生管理數(shù)據(jù)gocreatetable成績表(學(xué)號varchar(9)constraintfk_學(xué)號notnullforeignkeyreferences學(xué)生表(學(xué)號),
課程號varchar(4)constraintfk_課程號notnullforeignkeyreferences課程表(課程號),constraintpk_學(xué)號_課程號primarykey(學(xué)號,課程號),
成績tinyint)2、使用查詢分析器創(chuàng)建foreignkey約束7/22/202323SQL數(shù)據(jù)完整性例:向表添加列級外鍵約束,有約束名。use學(xué)生管理數(shù)據(jù)庫goaltertable成績表1
withcheckaddconstraintfk_課程號1foreignkey(課程號)references課程表1(課程號)2、使用查詢分析器創(chuàng)建foreignkey約束7/22/202324SQL數(shù)據(jù)完整性五default約束當(dāng)用戶沒有為定義為default約束的字段輸入數(shù)據(jù)時,由default約束提供默認的值。例:use學(xué)生數(shù)據(jù)庫gocreatetable成績表(學(xué)號varchar(9)constraintfk_學(xué)號notnullforeignkeyreferences學(xué)生表(學(xué)號),課程號varchar(4)constraintfk_課程號notnullforeignkeyreferences課程表(課程號),constraintpk_學(xué)號_課程號primarykey(學(xué)號,課程號),成績tinyintconstraintd_成績default'0')7/22/202325SQL數(shù)據(jù)完整性六check約束check約束限制了字段的取值范圍。與規(guī)則相似,check約束限制了向特定的字段列輸入數(shù)據(jù)的類型。表級定義的check約束可以對多個字段列進行核查。7/22/202326SQL數(shù)據(jù)完整性1、使用企業(yè)管理器創(chuàng)建check約束7/22/202327SQL數(shù)據(jù)完整性例:創(chuàng)建列級核查約束,有約束名。use學(xué)生管理數(shù)據(jù)庫gocreatetable成績表(學(xué)號varchar(9)constraintfk_學(xué)號notnullforeignkeyreferences學(xué)生表(學(xué)號),課程號varchar(4)constraintfk_課程號notnullforeignkeyreferences課程表(課程號),constraintpk_學(xué)號_課程號primarykey(學(xué)號,課程號),成績tinyintconstraintd_成績default'0'
constraintc_成績check(成績between0and100))2、使用查詢分析器創(chuàng)建check約束7/22/202328SQL數(shù)據(jù)完整性例:創(chuàng)建列級核查約束,無約束名。use學(xué)生管理數(shù)據(jù)庫gocreatetable成績表1(學(xué)號varchar(9),課程號varchar(4),成績tinyint
check(成績between0and100))2、使用查詢分析器創(chuàng)建check約束7/22/202329SQL數(shù)據(jù)完整性例:向表添加列級核查約束,有約束名。use學(xué)生管理數(shù)據(jù)庫goaltertable成績表1
withcheckaddconstraintc_成績check(成績between0and100)2、使用查詢分析器創(chuàng)建check約束7/22/202330SQL數(shù)據(jù)完整性3.7使用idendity列
標示為idendity屬性的列不必在插入新行時為其賦值,服務(wù)器會自動為其設(shè)置一個唯一的行序列號。例:
createtable學(xué)生表2(學(xué)號smallintidentity(1,1)primarykey,姓名varchar(8),性別varchar(2),年齡tinyint,所在院系varchar(10),班級名varchar(10),入學(xué)年份datetime)7/22/202331SQL數(shù)據(jù)完整性七查看約束Execsp_helpcinstrainttable_name7/22/202332SQL數(shù)據(jù)完整性1、使用企業(yè)管理器刪除約束八刪除約束7/22/202333SQL數(shù)據(jù)完整性
2、使用查詢分析器刪除約束
use學(xué)生管理數(shù)據(jù)庫goaltertable成績表dropconstraintc_成績
刪除約束7/22/202334SQL數(shù)據(jù)完整性默認是一種數(shù)據(jù)庫對象,它與默認值約束的功能一樣。若用戶輸入記錄時,在沒有給出具體的數(shù)據(jù)的字段中,系統(tǒng)會自動插入一個數(shù)據(jù)。默認值用來向無值的列(字段)提供一個預(yù)先指定的值。和規(guī)則一樣,默認在創(chuàng)建后,必須和某一列綁定才能生效。任務(wù)二默認7/22/202335SQL數(shù)據(jù)完整性
一創(chuàng)建默認1、使用企業(yè)管理器創(chuàng)建默認7/22/202336SQL數(shù)據(jù)完整性1、使用企業(yè)管理器創(chuàng)建默認7/22/202337SQL數(shù)據(jù)完整性
創(chuàng)建默認2、使用createdefault語句創(chuàng)建默認
createdefault<默認名稱>as<常量表達式>功能:
創(chuàng)建稱為默認值的對象。默認值定義是限制列數(shù)據(jù)的首選,也是標準的方法,因為定義和表存儲在一起,當(dāng)除去表時,將自動除去默認值定義。常量表達式只包含常量值的表達式,不能包含任何或其他數(shù)據(jù)庫對象的名稱。可以使用任何常量、內(nèi)建函數(shù)或數(shù)學(xué)表達式。例:演示創(chuàng)建默認的使用。
use學(xué)生管理數(shù)據(jù)庫
gocreatedefaulttime_defaultasgetdate()7/22/202338SQL數(shù)據(jù)完整性查看缺省值7/22/202339SQL數(shù)據(jù)完整性查看缺省值7/22/202340SQL數(shù)據(jù)完整性用存儲過程Sp_helptext查看缺省值例:
查看缺省值todayexecsp_helptexttoday運行結(jié)果如下------------------------------------------------------------------Text------------------------------------------------------------------createdefault[dp_date]asgetdate()7/22/202341SQL數(shù)據(jù)完整性
二
綁定默認1、使用企業(yè)管理器綁定默認7/22/202342SQL數(shù)據(jù)完整性綁定列7/22/202343SQL數(shù)據(jù)完整性
綁定默認2、使用sp_bindefault語句綁定默認
sp_bindefault<默認名>,<‘表.字段名’>例:演示綁定默認的使用。use學(xué)生管理數(shù)據(jù)庫gosp_bindefaulttime_default,'學(xué)生表.入學(xué)年份'7/22/202344SQL數(shù)據(jù)完整性三解除綁定使用企業(yè)管理器解除綁定
使用sp_unbindefault解除綁定
sp_unbindefault<‘表.字段名’>
例:演示解除綁定的使用
use學(xué)生課程數(shù)據(jù)庫
go
sp_unbindefault'學(xué)生表.入學(xué)年份'
7/22/202345SQL數(shù)據(jù)完整性四刪除默認使用企業(yè)管理器刪除默認使用dropdefault刪除默認
dropdefault<默認名稱>
例:演示刪除默認的使用。
use學(xué)生課程數(shù)據(jù)庫
go
dropdefaulttime_default7/22/202346SQL數(shù)據(jù)完整性
注:默認的使用限制
通過default子句為列(字段)定義默認值或通過sp_unbindefault綁定默認,兩者只能選擇一種方式。
默認只能用來設(shè)置常量或者SQLServer函數(shù)值。每列(字段)只能與一個默認綁定。確保默認的數(shù)據(jù)類型與其綁定列的數(shù)據(jù)類型一致。確保默認值與該列的規(guī)則一致。如果默認已經(jīng)與某列綁定,那么就不能刪除它,除非在刪除之前,已解除默認和列或數(shù)據(jù)類型的所有綁定關(guān)系。
7/22/202347SQL數(shù)據(jù)完整性規(guī)則就是數(shù)據(jù)庫中,對存儲在數(shù)據(jù)庫中表的列(字段)的規(guī)定和限制。規(guī)則是單獨存儲的獨立的數(shù)據(jù)庫對象,規(guī)則與作用的表是相互獨立的,即表的刪除修改,不會對與之相連的規(guī)則產(chǎn)生影響。規(guī)則和約束可以同時使用表的列,可以有一個規(guī)則及多個(check)約束規(guī)則。規(guī)則提供了一種加強列(字段)域約束的機制。規(guī)則要在insert和update語句之前給出。任務(wù)三規(guī)則7/22/202348SQL數(shù)據(jù)完整性
一創(chuàng)建規(guī)則1、使用企業(yè)管理器創(chuàng)建規(guī)則7/22/202349SQL數(shù)據(jù)完整性
2、使用createrule語句創(chuàng)建規(guī)則格式:createrulerule_nameascondition_expression說明:
rule_name:新規(guī)則的名稱。
condition_expression:定義規(guī)則的條件。規(guī)則可以是where子句中任何有效的表達式,并且可以包含諸如算術(shù)運算符,關(guān)系運算符和in、like、between之類的元素。規(guī)則不能引用列或其他數(shù)據(jù)庫對象.可以包含不引用數(shù)據(jù)庫對象的內(nèi)置函數(shù)。
condition_expression包含一個變量,每個局部變量的前面都有一個@符號,該表達式引用通過update或insert語句輸入的值。在創(chuàng)建規(guī)則時,可使用任何名稱或符號表示值,但第一個字符必須是@符號。7/22/202350SQL數(shù)據(jù)完整性例:創(chuàng)建考試成績規(guī)則score_rule。use學(xué)生課程數(shù)據(jù)庫gocreaterulecj_scopeas@cj_scopebetween0and100例:創(chuàng)建雇傭日期規(guī)則hire_date_rule。createrulehire_date_ruleas@hire_date>='1980-01-01'and@hire_date<=getdate()7/22/202351SQL數(shù)據(jù)完整性查看規(guī)則
7/22/202352SQL數(shù)據(jù)完整性用存儲過程Sp_helptext查看規(guī)則使用Sp_helptext存儲過程可以查看規(guī)則的細節(jié):sp_helptext[@objname=]'name'7/22/202353SQL數(shù)據(jù)完整性例:
查看規(guī)則hire_date_ruleexecsp_helptexthire_date_rule運行結(jié)果如下Text--------------------------------------------------------------------------------------createrulehire_date_ruleas@hire_date>='1980-01-01'and@hire_date<=getdate()7/22/202354SQL數(shù)據(jù)完整性
二綁定規(guī)則使用企業(yè)管理器綁定規(guī)則使用sp_bindrule綁定規(guī)則
sp_bindrule
<規(guī)則名稱>,<‘表.字段名’>
將規(guī)則綁定到列(字段)。綁定規(guī)則時,必須使用引號作為分隔符,參數(shù)中的圓點(.)將傳遞給sp_bindrule
。例:演示綁定規(guī)則的使用。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年網(wǎng)絡(luò)安全技術(shù)與防御策略考試題集
- 2026年圖書館圖書丟失管理員處理策略題
- 2026年證券從業(yè)資格題庫金融市場與投資分析要點解析
- 2026年計算機視覺與人工智能應(yīng)用試題集
- 2026年能源危機應(yīng)對與緊急調(diào)配策略題集
- 2026年機械設(shè)計與制造專業(yè)試題集
- 2026年旅游管理目的地營銷與旅游規(guī)劃題
- 2026年英語能力等級考試題庫
- 2026年新型材料科學(xué)與應(yīng)用模擬題
- 2026年生物醫(yī)學(xué)工程與生命科學(xué)應(yīng)用考試題
- 采購主管年終工作總結(jié)
- 電力公司安全第一課課件
- 物業(yè)現(xiàn)場管理培訓(xùn)課件
- 數(shù)據(jù)訪問控制策略分析報告
- 2025年市場監(jiān)管局招聘崗位招聘面試模擬題及案例分析解答
- 單杠引體向上教學(xué)課件
- 子宮內(nèi)膜異位癥病因課件
- GB/T 18910.103-2025液晶顯示器件第10-3部分:環(huán)境、耐久性和機械試驗方法玻璃強度和可靠性
- 經(jīng)圓孔翼腭神經(jīng)節(jié)射頻調(diào)節(jié)術(shù)
- 夢雖遙追則能達愿雖艱持則可圓模板
- 配件售后管理制度規(guī)范
評論
0/150
提交評論