數據完整性(Data Integrity)是指數據的精確性(Accuracy) 和可靠性(Reliability)。它是應防止數據庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。數據完整性分為四類:實體完整性(Entity Integrity)、域完整性(Domain Integrity)、參照完整性(Referential Integrity)、用戶定義的完整性(User-definedIntegrity)。
1.1 實體完整性(Entity Integrity)
實體完整性規定表的每一行在表中是惟一的實體。表中定義的UNIQUE PRIMARYKEY 和IDENTITY 約束就是實體完整性的體現。
1.2 域完整性(Domain Integrity)
域完整性是指數據庫表中的列必須滿足某種特定的數據類型或約束。其中約束又包括取值范圍、精度等規定。表中的CHECK、FOREIGN KEY 約束和DEFAULT、 NOT NULL定義都屬於域完整性的范疇。
1.3 參照完整性(Referential Integrity)
參照完整性是指兩個表的主關鍵字和外關鍵字的數據應對應一致。它確保了有主關鍵字的表中對應其它表的外關鍵字的行存在,即保證了表之間的數據的一致性,防止了數據丟失或無意義的數據在數據庫中擴散。參照完整性是建立在外關鍵字和主關鍵字之間或外關鍵字和惟一性關鍵字之間的關系上的。在SQL Server 中,參照完整性作用表現在如下幾個方面:
禁止在從表中插入包含主表中不存在的關鍵字的數據行;
禁止會導致從表中的相應值孤立的主表中的外關鍵字值改變;
禁止刪除在從表中的有對應記錄的主表記錄。
1.4 用戶定義的完整性(User-defined Integrity)
不同的關系數據庫系統根據其應用環境的不同,往往還需要一些特殊的約束條件。用戶定義的完整性即是針對某個特定關系數據庫的約束條件,它反映某一具體應用所涉及的數據必須滿足的語義要求。SQL Server 提供了定義和檢驗這類完整性的機制,以便用統一的系統方法來處理它們,而不是用應用程序來承擔這一功能。其它的完整性類型都支持用戶定義的完整性。
SQL Server 提供了一些工具來幫助用戶實現數據完整性,其中最主要的是:規則(Rule)、缺省值(Default)、約束(Constraint) 和觸發器(Trigger)。其中約束在前面的章節中已經介紹,觸發器將在后面的章節中介紹。本章將介紹規則和缺省值。
數據庫一致性(Database Consistency)是指事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
保證數據庫一致性是指當事務完成時,必須使所有數據都具有一致的狀態。在關系型數據庫中,所有的規則必須應用到事務的修改上,以便維護所有數據的完整性。
保證數據庫的一致性是數據庫管理系統的一項功能.比如有兩個表(員工/職位),員工表中有員工代碼、姓名、職位代碼等屬性,職位表中有職位代碼、職位名稱、職位等級等屬性。你在其中員工表中進行了插入操作,你插入了一個新員工的信息,而這個新員工的職位是公司新創建的一個職位。如果沒有一致性的保證,就會出現有這么一個員工,但是不知道他到底擔當什么職責!這個只是它的一個小小方面。
讀一致性也是數據庫一致性的一個重要方面,在實際中,我們會遇到這種情況:我們對一個表中的某些數據進行了更新操作,,但是還沒有進行提交,這時另外一個用戶讀取表中數據.這個時候就出現了讀一致性的問題:到底是讀什么時候的數據呢?是更新前的還是更新后的?在DBMS中設有臨時表,它用來保存修改前的值,在沒有進行提交前讀取數據,會讀取臨時表中的數據,這樣一來就保證了數據是一致的.(當前用戶看到的是更新后的值)
但是還有一種情況:用戶user1對表進行了更新操作,用戶user2在user1還沒有進行提交前讀表中數據,而且是大批量的讀取(打個比方:耗時3分鍾)而在這3分鍾內user1進行了提交操作,那又會產生什么影響呢?這個時候怎么保證讀寫一致性呢?這個時候DBMS就要保證有足夠大的臨時表來存放修改前的數值,,以保證user2讀取的數據是修改前的一致數據.然后下次再讀取時候就是更新后的數據了.
