摘要:保證數據庫中數據的完整性,在數據庫應用中是十分重要的,它是衡量數據庫中數據質量的重要標志。在SQLServer 2000中,可以通過“約束”、“規則”、“默認”、“觸發器”、“存儲過程”等來達到保證數據完整性的目的。
關鍵詞:數據庫;SQL Server 2000,數據完整性;約束;規則;默認;觸發器;存儲過程。
“數據完整性”是SQL Server數據庫的重要特點之一,它通過在數據庫端使用特定的規定來管理數據的輸入與輸出,而不是由應用程序本身來控制,這就使得數據獨立于應用程序成為開放的數據庫系統。
“數據完整性”是指存放在數據庫中數據的一致性和準確性,也就是對數據庫表中的數據進行限制,以防止數據庫中存在不符合語義規定的數據或與事實相矛盾的數據。如一張<學生信息表>中“學號”字段中數據應該保持惟一性,既不允許有相同的學號出現,同時也不允許為空值;“性別”字段中數據必須限制為‘男’或‘女’兩個值,而不應該允許其他字符存在。在<學生成績表>中“學號”字段中數據應該是<學生信息表>中“學號”字段中已有的數據,如<學生信息表>“學號”字段中沒有該學號,則說明該生不存在,在<學生成績表>“學號”字段中出現就與事實相矛盾。
保證數據庫中數據的完整性,在數據庫應用中是十分重要的,它是衡量數據庫中數據質量的重要標志。
在SQL Server 2000中,可以通過“約束”、“規則”、“默認”、“觸發器”、“存儲過程”等來達到保證數據完整性的目的。
一、數據完整性分類
根據數據完整性措施所作用的數據庫對象和范圍的不同,數據完整性可以分為4種類型:實體完整性(Entity Integrity)、域完整性(Domain Integrity)、參照完整性(Referential Integrity)、用戶定義的完整性(user-defined Integrity)。
1.實體完整性。實體完整性也稱為行完整性,是規定表中的每一行數據在表中保證惟一且非空值,即數據庫中所有的行都具有一個非空且沒有重復的標識字段,這樣就確保數據庫中所代表的任何實體均不存在重復的條目。實現實體完整性可以通過建立“惟一索引”、“DRIMARY KEY約束”、“UNIQUE約束”以及列的“IDENTITY屬性”等措施來實施。
2.域完整性。域完整性也稱為列完整性,用于限制用戶向表中某列輸入非法或與事實不符的內容。實現域完整性可以通過“DEFAULT約束”、“DEFAULT默認”、“CHECK約束”、“FOREIGN約束”、“RULE規則”、數據類型、“NOT NULL約束”等實施。
3.參照完整性。參照完整性也稱為引用完整型,用于一張表中某列的數據只能引用另一張表中關鍵字段中的數據。保證表之間的數據一致性,防止沒有意義的數據出現。實現參照完整性可以通過“FOREIGN KEY約束”、“CKECK約束”、“觸發器TRIGGER”、“存儲過程PROCEDURE”等實施。
4.用戶定義的完整性。用戶定義的完整性是用戶根據特殊要求自定義的規則或格式。實現用戶定義的完整性可以通過“DEFAULT默認”、“CHECK約束”、“RULE規則”等實施。
數據完整性也可以按照其作用范圍來分為3種類型:
一是列對象級。是在定義表的同時定義的,作用范圍是數據庫的某個表的某列,完全依賴表及所在列存在,刪除表或該列則失去作用,可以通過“約束”來實施。
二、表對象級。是在定義表的同時定義的,作用范圍是數據庫的某個表對象,完全依賴表存在,刪除表則失去作用,可以通過“約束”來實施。
三是庫對象級。是作為數據庫的對象單獨定義的,因此單獨存在于數據庫中,作用范圍是整個數據庫的任何表,需要時可以綁定到數據庫的任何表或用戶定義的數據類型中,可以通過“默認”、“規則”等獨立對象來實施。
二、數據完整性實施步驟
1.通過“約束”實施數據的完整性
通過“約束”可實施列對象級和表對象級的數據完整性。SQL Server支持的“約束”有如下幾種:非空約束NOT NULL,主鍵約束PRIMARY KEY、惟一約束UNIQUE、核查約束CHECK、外鍵約束FOREIGN KEY、默認值約束DEFAULT。“約束”的定義可在創建表或更改表同時進行。
(1) 創建表時定義“約束”
舉例1:CREATE TABLE學生信息表
(學號 char(6)PRIMARY KEY,
姓名 char(8)NOT NULL。
性別 char(2)CHECK c性別=‘男’OR 性別=‘女’)
)
/*以上定義的全為列對象級數據完整性,定義“學號”列為主鍵,“姓名”列為非空值,“性別”列通過檢驗CHECK (性別=‘男’OR 性別=‘女’)保證“性別”字段值為‘男’或‘女’。*/
CREATE TABLE課程表
(課程名char (20)PRIMARY KEY,
課程性質char(4),
CONSTRAINT kcxz_id CHECK(課程性質=‘考試’or 課程性質=‘考查’)
)
/*以上定義的“約束”CONSTRAINT kcxz_id CHECK (課程性質=‘考試’or 課程性質=‘考查’)為表對象級數據完整性*/
CREATE TABLE 學生成績表
(學號 char(6),
課程名 char(20),
成績 int,
補考成績int,
CONSTRAINT xh_kcm_ID PRIMARY KEY(學號,課程名),
CONSTRAINT xh_id FOREIGN KEY(學號)REFERENCES學生信息表(學號),
CONSTRAINT kcm_id FOREIGN KEY(課程名)REFERENCES課程表(課程名)
)
/*以上三個“約束”全為表對象級約束,約束CONSTIAINTxh_kcm_ID PRIMARY KEY (學號,課程名)保證“學號+課程名”非空且惟一,約束CONSTRAINT xh_id FORElGN KEY(學號)REFERENCES學生信息表(學號)、CONSTRAINT kcm_idFOREIGN KEY(課程名)REFERENCES課程表(課程名)保證該表中的“學號”和“課程名”字段值只能取<學生信息表>中已存在的“學號”值和<課程表>中已存在的“課程名”值。*/
(2) 更改表時定義“約束”
舉例2:ALTER TABLE 學生成績表
ADD
CONSTRAINT ci_id CHECK (成績>=0 and 成績<=100)
/*以上通過修改<學生成績表>添加表對象級約束CON-STRAINT cj_id CHECK(成績>=0 and 成績<=100)使學生成績必須在某個范圍內。*/
2.通過“規則”實施數據的完整性
“規則”的作用類似于“檢查約束”,若將一個“規則”綁定到指定列上,則可以檢查該列的數據是否符合“規則”的要求。“規則”與“檢查約束”的主要區別在于一列只能綁定一個“規則”,但卻可以設置多個“檢查約束”。“規則”的優點是僅創建一次就可以綁定到數據庫的多個表的列上,使同一個數據庫中所有表的不同列共享。“規則”還可以綁定到同一數據庫中一個以上的用戶定義的數據類型上。使用“規則”的過程依次為:創建規則——綁定規則——解除綁定——刪除規則。
舉例3:CREATE RULE rule_cj
AS @成績>=0 and @成績<=100 /*創建名為“rule_cj'’的“規則”*/
GO
sp_bindrule rule_cj,‘學生成績表.成績’
/*將“規則rule_cj”綁定到<學生成績表>的“成績”字段*/
sp_bindrule rule_cj,‘學生成績表.補考成績’
/*將“規則rule_cj”綁定到<學生成績表>的“補考成績”字段*/
3.通過“默認”實施數據的完整性
與“規則”類似,“默認值”對象(簡稱為“默認”)也是僅創建一次就可以綁定到數據庫的多個表的列或用戶定義的數據類型中,使它們共享“默認”。使用“默認”的過程與使用“規則”的過程類似,依次為:創建默認——綁定默認——解除綁——刪除默認。
4.通過“觸發器”實施數據的完整性
“觸發器”與“約束”類似的是它與表也是緊密聯系的,離開了表它將不復存在。但“觸發器”又不像“存儲過程”那樣需要調用才能執行,而是在對表中數據進行增、刪、改(INSERT、DELETE、UPDATE)操作時被觸發而執行。
舉例4:CREATE TRIGGER trigger_xh
ON 學生成績表
AFTER INSERT
AS
IF(SELECT CONUT(*)FROM學生信息表,INSERTED
WHERE學生信息表學號=INSERTED.學號)=0
BEGIN
PRINT‘學號不存在’
ROLLBACK TRAN
END
/*在<學生成績表>上創建一個名為“triggeL_xh”的“觸發器”,當向該表中插入一條記錄時,檢查該學生的學號是否在<學生信息表>中已經存在,如果存在,則插入;否則,打印‘學號不存在’,并回滾事務,使插入數據無效。*/
5.通過“存儲過程”實施數據的完整性
“存儲過程”與“觸發器”都是SQL Server中的數據庫對象,所不同的是“存儲過程”是由用戶根據需要調用執行的。另外,“存儲過程”可以不依附表而單獨存在。“存儲過程”也可用于數據完整性的實施,提供級聯和復雜的應用程序功能,一般只能是事務之后執行,在此不再舉例說明。