sql完整性
SQL把各種完整性約束作為數(shù)據(jù)庫(kù)模式定義的一部分,由數(shù)據(jù)庫(kù)管理系統(tǒng)維護(hù),這樣即可有效防止對(duì)數(shù)據(jù)庫(kù)的意外破壞,提高了完整性檢測(cè)的效率,又減輕了編程人員的負(fù)擔(dān)。
SQL?Server支持三種完整性約束:
1、實(shí)體完整性
2、參照完整性(或引用完整性)
3、用戶(hù)自定義完整性
1、實(shí)體完整性和主碼
實(shí)體完整性是通過(guò)主碼(PRIMARY?KEY)的定義來(lái)實(shí)現(xiàn)的。一旦某個(gè)屬性或?qū)傩越M被定義為主碼,該主碼的每個(gè)屬性就不能為空值,并且在表中不能出現(xiàn)主碼值完全相同的兩個(gè)記錄。
主碼可以在CREATE?TABLE語(yǔ)句中使用PRIMARY?KEY定義。有兩種定義主碼的方法:一種是在屬性后增加關(guān)鍵字,另一種是在屬性表中加入額外的定義主碼的子句:PRIMARY?KEY(主碼屬性名表)。
(1)屬性后增加關(guān)鍵字定義
CREATE?TABLE?StudentInfo
(
????StudentID????????char(8)????PRIMARY?KEY,
????StudentName????varchar(10),
????StudentSex????????bit
);
(2)加入額外的定義主碼的子句
CREATE?TABLE?StudentInfo
(
????StudentID????????char(8),
????StudentName????varchar(10),
????StudentSex????????bit,
????PRIMARY?KEY(StudentID)
);
如果表的主碼只含有單個(gè)屬性,上面的兩種方法都可以使用。如果主碼由多個(gè)屬性組成,只能使用第二種方法。
除了主碼,SQL提供了類(lèi)似候選碼的說(shuō)明方法,使用關(guān)鍵字UNIQUE定義(與候選碼不同的是:定義為UNIQUE的屬性可以定義為空值,但只能有一個(gè)記錄該屬性的值為NULL),說(shuō)明該屬性(或?qū)傩越M)的值不能重復(fù)。
一個(gè)表中只能有一個(gè)主碼,但可以有多個(gè)“UNIQUE”定義。
2、參照完整性(引用完整性)約束和外部碼
在更新記錄時(shí),參照完整性保持表之間已定義的關(guān)系。參照完整性基于外鍵與主鍵之間或外鍵與唯一鍵之間的關(guān)系。參照完整性確保鍵值在所有表中一致。這樣的一致性要求不能引用不存在的值,如果鍵值更改了,那么在整個(gè)數(shù)據(jù)庫(kù)中,對(duì)該鍵值的所有引用要進(jìn)行一致的更改。??
強(qiáng)制參照完整性時(shí),SQL?Server?禁止用戶(hù)進(jìn)行下列操作:
<1>當(dāng)主表中沒(méi)有關(guān)聯(lián)的記錄時(shí),將記錄添加到相關(guān)表中。
<2>更改主表中的值并導(dǎo)致相關(guān)表中的記錄孤立。
<3>從主表中刪除記錄,但仍存在與該記錄匹配的相關(guān)記錄。?
(1)外部碼約束的說(shuō)明
說(shuō)明外部碼的方法有兩種:
<1>在該屬性的說(shuō)明(屬性名、類(lèi)型)后直接加上關(guān)鍵字REFERENCES,后跟對(duì)應(yīng)表的主碼說(shuō)明
格式為:REFERENCES<父表名>(<屬性名>)
說(shuō)明RelationInfo表中StudentID為外部碼,參照關(guān)系為StudentInfo。
CREATE?TABLE?RelationInfo
(
????RelationID????int?identity(1,?1),
????StudentID????char(8)?REFERENCES?StudentInfo(StudentID),
????DepartID?????char(4)????
);
<2>在CREATE?TABLE?語(yǔ)句的屬性清單后,加上外部碼的說(shuō)明子句
格式為:FOREIGN?(<屬性名表>)REFERENCES<父表名>(<屬性名表>)
(
????RelationID????int?identity(1,?1),
????StudentID????char(8)?,
????DepartID?????char(4)?,
????FOREIGN?KEY?(StudentID)?REFERENCES?StudentInfo(StudentID)???
);
(2)參照完整性約束的實(shí)現(xiàn)策略
當(dāng)用戶(hù)的操作違反了上述規(guī)則時(shí),SQL?提供了兩種可選方案供數(shù)據(jù)庫(kù)實(shí)現(xiàn)者使用:RESTRICT(限制策略);CASCADE(級(jí)聯(lián)策略);
<1>限制策略
限制策略是SQL的默認(rèn)策略,任何違反參照完整性的更新均被系統(tǒng)拒絕。
<2>級(jí)聯(lián)策略
當(dāng)用戶(hù)刪除或更新外鍵所指向的鍵時(shí),SQL提供了另一種方案,即級(jí)聯(lián)策略。
通過(guò)在REFERENCES子句后添加ON?DELETE?和?ON?UPDATE子句實(shí)現(xiàn):
[?ON?DELETE?{?CASCADE?|?NO?ACTION?}?]
[?ON?UPDATE?{?CASCADE?|?NO?ACTION?}?]?
如果沒(méi)有指定ON?DELETE?或?ON?UPDATE,則默認(rèn)為NO?ACTION。???
?
ON?DELETE?NO?ACTION指定如果試圖刪除某行,而該行含有由其它表的現(xiàn)有行中的外鍵所引用的鍵,則產(chǎn)生錯(cuò)誤并回滾?DELETE。
ON?UPDATE?NO?ACTION
指定如果試圖更新某行中的鍵值,而該行含有由其它表的現(xiàn)有行中的外鍵所引用的鍵,則產(chǎn)生錯(cuò)誤并回滾?UPDATE。
CASCADE?允許在表間級(jí)聯(lián)鍵值的刪除或更新操作,這些表的外鍵關(guān)系可追溯到執(zhí)行修改的表。不能為任何具有?timestamp?列的外鍵和主鍵指定?CASCADE。
ON?DELETE?CASCADE
指定如果試圖刪除某行,而該行含有由其它表的現(xiàn)有行中的外鍵所引用的鍵,則也將刪除所有包含那些外鍵的行。如果在目標(biāo)表上也定義了級(jí)聯(lián)引用操作,則對(duì)從那些表中刪除的行同樣采取指定的級(jí)聯(lián)操作。
ON?UPDATE?CASCADE
指定如果試圖更新某行中的鍵值,而該行的鍵值由其它表的現(xiàn)有行中的外鍵所引用,則所有外鍵值也將更新成為該鍵指定的新值。如果在目標(biāo)表上也定義了級(jí)聯(lián)引用操作,則對(duì)在那些表中更新的鍵值同樣采取指定的級(jí)聯(lián)操作。
3、用戶(hù)自定義完整性約束
SQL提供非空約束、對(duì)屬性的CHECK約束、對(duì)元組的CHECK約束、觸發(fā)器等來(lái)實(shí)現(xiàn)用戶(hù)的完整性要求。
<1>基于屬性的CHECK約束
使用CHECK(檢查)子句可保證屬性值滿(mǎn)足某些前提條件。CHECK子句的一般格式為:
CHECK<條件>
屬性的CHECK約束既可跟在屬性的定義后,也可在定義語(yǔ)句中另增一子句加以說(shuō)明。
設(shè)定StudentInfo表中age值不能小于18、大于65。只需將age屬性說(shuō)明為如下形式:
age?int?CHECK(age?>=?18?and?age?<=?65)
<2>基于元組的約束
CREATE?TABLE?salary
(
????Eno?char(4),
????Basepay?decimal(7,?2),
????Insure?decimal(7,?2),
????Fund?decimal(7,?2),
????CHECK?(Insure?+?Fund?<?Basepay)
);
上面例子中,CHECK約束涉及到表中多個(gè)屬性,為元組約束。
約束的更新
約束與數(shù)據(jù)庫(kù)中的表、視圖等一樣,可以進(jìn)行增加、刪除和修改的更新操作。為了更新約束,需要在定義約束是對(duì)約束進(jìn)行命名,在約束前加上關(guān)鍵字CONSTRAINT和該約束的名稱(chēng)。
例如要說(shuō)明StudentInfo表中的主碼時(shí),將其命名為PK_StudentInfo_ID
CREATE?TABLE?StudentInfo
(
????StudentID????????char(8),
????StudentName????varchar(10),
????StudentSex????????bit,
?????CONSTRAINT?PK_StudentInfo_ID??PRIMARY?KEY(StudentID)
);
可以使用ALTER?TABLE語(yǔ)句來(lái)更新與屬性或表有關(guān)的約束。
(1)刪除約束:
ALTER?TABLE?DROP?CONSTRAINT?約束名
(2)增加約束
ALTER?TABLE?ADD?CONSTRAINT?約束名?約束定義
?
?
轉(zhuǎn)載于:https://blog.51cto.com/jxyx521/1286966
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: Find Minimum in Rota
- 下一篇: linux(虚拟机中)与windows共