1.數據庫的完整性:
①數據庫的完整性是指數據的正確性和相容性
②數據庫完整性是防止不合語義或不正確的數據進入數據庫
③完整性體現了是否真實地反映現實世界
例:
學生的年齡必須是整數,取值范圍為14-29;
學生的性別只能是男或女;
學生的學號一定是唯一的;
學生所在的系必須是學校開設的系;
2.DBMS維護數據庫完整性的機制:
①提供定義完整性約束條件的機制
DBMS應提供定義數據庫完整性約束條件,並把它們存入數據庫中。
②提供完整性檢查的方法
檢查數據是否滿足完整性約束條件的機制稱為完整性檢查。一般在INSERT、UPDATE、DELETE語句執行后開始檢查。
3.違約處理
DBMS若發現用戶的操作違背了完整性約束條件,就采取一定的動作以保證數據的完整性,如拒絕執行該操作,或級聯執行其他操作。

二、缺省(默認值)和規則
缺省和規則來源於由Sybase開發的S默認值QL Server,在老版本的SQL Server或者升級版本中都有缺省和規則的使用。
缺省是為列提供數據的一種方式,如果用戶進行INSERT操作時不為列輸入數據,則使用缺省值。
規則是當用戶進行INSERT或uPDATE操作時,對輸入列中的數據設定的取值范圍,是實現域完整性的方式之一。
缺省與規則有以下特點:
(1)缺省與規則是數據庫對象,它們是獨立於表和列而建立的。
(2)缺省與規則建立后與列或數據類型產生關聯,列和數據類型就具有了缺省與規則的屬性。
(3)缺省與規則定義后,可以重復使用,可以綁定到多個列或數據類型上。
(4)缺省與規則不隨表同時調入內存,當用到時才被調入內存,這可能會使程序執行出現延時。
缺省和規則對象通常只在它所創建的數據庫中有效,不是ANSI標准,一般不提倡使用。
應盡可能使用約束,任何可以使用缺省與規則的地方都有可以使用約束。
1. 缺省
在SQL Server中,有兩種使用默認值的方法:
①在創建表時,指定默認值。
用SQL Server Management Studio創建表時在設計表時指定默認值,可以在輸入字段名稱后,設定該字段的默認值。
或使用CREATE TABLE語句中的DEFAULT子句指定默認值。
②使用CREATE DEFAULT語句創建默認對象后,使用存儲過程sp_bindefault將該默認對象綁定到列上。
默認值對象是單獨存儲的,刪除表的時候,DEFAULT約束會自動刪除,但是默認值對象不會被刪除。
創建默認值對象后,需要將其綁定到某列或者用戶自定義的數據類型上。
主要操作:
①創建默認值對象
②綁定默認值對象
③解除默認值對象的綁定
④查看默認值對象
⑤刪除默認值對象
①創建默認對象
可以使用CREATE DEFAULT語句創建默認對象。其語法格式如下:
CREATE DEFAULT default AS constant_expression
例如: create default d_grade as 1
②綁定默認對象
默認對象創建后不能使用,必須首先將其綁定到某列或者用戶自定義的數據類型上。其使用語法格式如下:
sp_bindefault [@defname = ] 'default', [@objname = ] 'object_name' [, [@futureonly = ] 'futureonly_flag']
其中: [, [@futureonly = ] ‘futureonly_flag’]僅在此之后將默認值綁定到用戶定義的數據類型時才使用。
例如: exec sp_bindefault 'd_grade', ‘sc.grade'
③解除默認對象的綁定
解除綁定可以使用sp_unbindefault存儲過程。其語法格式如下:
sp_unbindefault [@objname = ] 'object_name'
例如: exec sp_unbindefault ‘sc.grade'
④查看默認對象
exec sp_help d_grade
exec sp_helptext d_grade
⑤刪除默認對象
在刪除默認對象之前,首先要確認默認對象已經解除綁定。刪除默認對象使用DROP DEFAULT語句。其語法格式如下:
DROP DEFAULT {default} [,…n]
例如: drop default d_grade
2.規則
規則用以限制存儲在表中或用戶自定義數據類型的值,是獨立的數據庫對象。
將規則綁定到列或用戶自定義數據類型時,規則才起作用。
表中的每列或每個用戶定義數據類型只能和一個規則綁定。但每列可應用多個CHECK約束。
如果要刪除規則,應確定規則已經解除綁定。
①創建規則
CREATE RULE語句,其語法格式如下:
CREATE RULE rulename AS condition_expression
其中各參數含義如下:
rulename 是新規則的名稱。
condition_expression 是定義規則的條件。
例如:create rule r_grade as @grade<=100 and @grade>=0
②綁定規則
使用sp_bindrule存儲過程,語法格式為:
sp_bindrule [@rulename = ] 'rulename', [@objname = ] ‘object_name’
例如: exec sp_bindrule 'r_grade','sc.grade‘
注意:
規則不能綁定到text、image或timestamp列。
如果規則與綁定的列不兼容,SQL Server將在插入值時返回錯誤信息。
未解除綁定的規則,如果再次將一個新的規則綁定到列,舊的規則將自動被解除,只有最近一次綁定的規則有效
如果列中包含CHECK約束,則CHECK約束優先。
③解除規則的綁定
使用sp_unbindrule存儲過程。語法格式如下:
sp_unbindrule [@objname = ] 'object name' [,[@futureonly = ] 'futureonly_ lag']
例如:
exec sp_unbindrule 'sc.grade'
④刪除規則
首先要解除規則的綁定,然后才能刪除綁定
例如:drop rule r_grade
三、約束
SQL Server 2008提供的強制數據完整性的機制:
①PRIMARY KEY 約束
②FOREIGN KEY 約束
③UNIQUE 約束
④CHECK 約束
⑤NOT NULL(非空性)
⑥IDENTITY 約束
使用約束優先於使用觸發器、規則和默認值
查詢優化器使用約束定義生成高性能的查詢執行計划
①PRIMARY KEY 約束:
可以在下面情況下使用:
(1)作為表定義的一部分在創建表時創建。
(2)添加到尚沒有PRIMARY KEY約束的表中(一個表只能有一個PRIMARY KEY約束)。
(3)如果已有PRIMARY KEY約束,則可對其進行修改或刪除。
特點:
(1)每個表都應有一個主鍵,主鍵值唯一。
(2)主鍵內的任何列不能為空(null)。
(3)要使用TRansact-SQL修改PRIMARY KEY,必須先刪除現有的PRIMARY KEY約束,然后再重新創建。
(4)創建表時指定主鍵,sql server會自動創建一個名為“PK_”且后跟表名的主鍵索引。如果不指定索引類型,則默認為聚集索引。該索引只能在刪除與它保持聯系的表或主鍵約束時才能刪除。
②FOREIGN KEY約束
標識表之間的關系,用於強制參照完整性,為表中一列或多列提供參照完整性。 FOREIGN KEY約束也可以參照自身表中的其他列(例如:學生表中的“班長學號”列參照“學號”列),這種參照稱為自參照。
FOREIGN KEY約束可以在下面情況下使用:
(1)作為表定義的一部分在創建表時創建。
(2)如果現有表的某列與另一個表已有的PRIMARY KEY約束或UNIQUE約束相關聯,則可向現有表添加FOREIGN KEY約束。
(3)對已有的FOREIGN KEY約束進行修改或刪除。
使用FOREIGN KEY約束,應注意的幾個問題:
(1)每個表最多可以有253個FOREIGN KEY約束。
(2)FOREIGN KEY約束只能參照同一個數據庫中的表,而不能參照其他數據庫中的表。
(3)FOREIGN KEY子句中的列數目和每個列指定的數據類型必須和REFERENCES子句中的列相同。
(4)FOREIGN KEY約束不能自動創建索引。
(5)在臨時表中,不能使用FOREIGN KEY約束。
(6)如果一個外鍵沒有對應的主鍵值,則不能插入帶該值的行。
③UNIQUE約束
(1)UNIQUE約束在列集內強制執行值的唯一性。
(2)對於UNIQUE約束中的列,表中不允許有兩行包含相同的非空值。
(3)SQL Server創建了UNIQUE約束后會自動創建UNIQUE索引來強制UNIQUE約束的唯一性要求。
(4)如果插入重復行,SQL Server將返回錯誤信息。
(5)向表中的現有列添加UNIQUE約束時,默認情況下SQL Server 2008檢查列中的現有數據確保除NULL外的所有值均唯一。
(6)UNIQUE約束與主鍵約束的區別:
主鍵也強制執行唯一性,但主鍵不允許空值,而且每個表中主鍵只能有一個,但UNIQUE列可以有多個,可以取空值。
(7)UNIQUE約束優先於唯一索引。
④CHECK約束
(1)CHECK約束通過限制用戶輸入的值來加強域完整性。
(2)它指定應用於列中輸入的所有值的布爾(取值為TRUE或FALSE)搜索條件,拒絕所有不取值為TRUE的值。
(3)可以為每列指定多個CHECK約束。
⑤IDENTITY約束
自動編號約束又稱作標識列,采用數字編號的方式依次增加一個增量。是為那些數字順序遞增的列准備的約束,可以自動完成數值添加。
(1)標識種子
(2)標識增量
(3)標識列的數據類型
四、完整性約束命名子句
完整性約束命名子句的格式:
CONSTRAINT <完整性約束條件名>[PRIMARY KEY短語|FOREIGN KEY 短語|CHECK短語]
例:建立學生登記表Student2,要求學號在10000至99999之間,姓名不能取空值,年齡小於30,性別‘男’或‘女’:
1 CREATE TABLE Student2( 2 sno int CONSTRAINT C1 CHECK (sno BETWEEN 10000 AND 99999), 3 sname CHAR(8) CONSTRAINT C2 NOT NULL, 4 sage int CONSTRAINT C3 CHECK (sage<30), 5 ssex VARCHAR(2) CONSTRAINT C4 CHECK (ssex IN ('男', '女')), 6 CONSTRAINT SK PRIMARY KEY(Sno) 7 );