數據庫完整性主要分為以下這些:
實體完整性(Entity Integrity):明確規定數據表的每一行在表中是唯一的實體。如表中定義的UNIQUE PRIMARYKEY和IDENTITY約束。
域完整性(Domain Integrity):指數據庫表中的列必須滿足某種特定的數據類型或約束。其中,約束又包括取值范圍、精度等規定。如表中的CHECK、FOREIGN KEY約束和DEFAULT、NOT NULL等要求。
參照完整性(Referential Integrity):是指任何兩表的主關鍵字和外關鍵字的數據要對應一致,確保表之間數據的一致性,以防止數據丟失或造成混亂。主要作用為:禁止在從表中插入包含主表中不存在的關鍵字的數據行;禁止可導致從表中的相應值孤立的主表中的外關鍵字值改變;禁止刪除在從表中的有對應記錄的主表記錄。
用戶定義完整性(User-defined Integrity):是針對某個特定關系數據庫的約束條件,可以反映某一具體應用所涉及的數據必須滿足的語義要求。SQL Server提供了定義和檢驗這類完整性的機制,以便用統一的系統方法進行處理,而不是用應用程序承擔此功能。其他完整性類型都支持用戶定義的完整性。
數據庫的數據不一致性包括以下幾種:
丟失或覆蓋更新:當兩個或多個事務選擇同一數據,并且基于最初選定的值更新該數據時,會發生丟失更新問題。每個事務都不知道其他事務的存在。最后的更新將重寫由其他事務所做的更新,這將導致數據丟失。如上述飛機票售票問題。
不可重復讀:在一個事務范圍內,兩個相同查詢將返回不同數據,這是由于查詢注意到其他提交事務的修改而引起的。如一個事務重新讀取前面讀取過的數據,發現該數據已經被另一個已提交的事務修改過。即事務1讀取某一數據后,事務2對其做了修改,當事務1再次讀數據時,得到與第一次不同的值。
讀臟數據:指一個事務讀取另一個未提交的并行事務所寫的數據。當第二個事務選擇其他事務正在更新行時,會發生未確認的相關性問題。第二個事務正在讀取的數據還沒有確認并可能由更新此行的事務所更改。即若事務T2讀取事務T1正在修改的一個值(A),此后T1由于某種原因撤銷對該值的修改,造成T2讀取的值是“臟”的。
破壞性的數據定義語言DDL操作:當一個用戶修改一個表的數據時,另一個用戶同時更改或刪除該表。