JET 資料庫/資料完整性
JET(及其主要應用程式包裝器 Microsoft Access)通常因資料完整性差而受到指責,但這通常是因為資料庫的資料完整性功能很少或根本沒有得到適當使用。
JET 資料庫支援關係資料庫所期望的許多標準資料完整性功能,包括約束、事務和鎖定。這種支援隨著時間的推移而發展,只有 JET 4.0 支援某些功能。
在多使用者環境中使用 JET 資料庫也存在一些鎖定和緩衝問題,特別是在區域網 (LAN) 上。然而,此類問題可能是另一章的主題。
主鍵有助於為表定義一組列,這些列可用於唯一標識每一行。在構成主鍵的列中,任何兩行都不能具有相同的值,資料庫透過拒絕在主鍵列中已存在具有這些值的行的同時插入行來強制執行此約束。
JET 支援唯一索引和唯一約束,它們是微妙不同的概念,但本質上實現了相同的功能。唯一索引是一個索引,該索引的列不能具有重複的值,而唯一約束是一個數據完整性規則,它阻止插入具有相同值的行的約束中列出的列。兩者都可以用來實現邏輯資料模型概念中的候選鍵。
JET 引擎透過建立唯一索引來實現唯一約束的概念。唯一約束可以在Create Table語句中新增到表中,或者透過Alter Table語句新增。
JET 支援外部索引鍵約束,允許在資料庫級別強制執行實體關係資料建模規則。外部索引鍵約束阻止在相關表中不存在對應行的行被插入,並且還阻止在相關表具有引用它們的依賴行時刪除行。
JET 引擎會自動在構成外部索引鍵的列上建立索引。
外部索引鍵約束必須引用所引用表上的主鍵、唯一約束或唯一索引中的所有列。下面的程式碼顯示了一個引用另一個表上的唯一約束(例如候選鍵)的外部索引鍵。
Create Table F3 (
id int identity(1, 1) not null,
a int not null,
b varchar(20) not null,
c varchar(20) not null,
Constraint F3_pk Primary Key (id),
Constraint F3_uc Unique (a, b)
)
go
Create Table F4 (
i int not null,
a int not null,
b varchar(20) not null,
Constraint F4_pk Primary Key (i),
Constraint F4_fk1 Foreign Key (a, b) References F3 (a, b)
)
go
JET 4.0 引入了對外部索引鍵的級聯更新和刪除。當使用Update Cascade建立外部索引鍵時,如果所引用列發生更改,則外部索引鍵會更新。Delete Cascade會導致在刪除所引用行時刪除引用行,而Delete Set Null會將外部索引鍵設定為 Null(如果刪除所引用行)。
Create Table F5 (
i int not null,
a int not null,
b varchar(20) not null,
Constraint F5_pk Primary Key (i),
Constraint F5_fk1 Foreign Key (a, b) References F3 (a, b)
On Update Cascade On Delete Set Null
)
go
JET 4.0 引入了檢查約束,這些約束在資料庫的資料完整性中應用了額外的邏輯。檢查約束是一個表示式,它進一步約束了列中允許的值。表示式可以是簡單的值邊界驗證,也可以包含引用其他表中值的子查詢。
檢查約束不僅可以用於驗證輸入值。以下示例展示了檢查約束如何確保表只包含一行。
Create Table Singleton (
ID Char(1) Not Null,
a varchar(20),
...
Constraint Singleton_PK Primary Key (ID),
Constraint Singleton_One_Row check(ID = 'A')
)
go
從 JET 4.0 開始,JET 支援多個語句的事務,使開發人員能夠編寫健壯的程式碼來更新資料庫,而不會影響邏輯一致性,例如,允許建立一半的發票或更新一半的客戶記錄。因此,在已宣告事務中,語句將一起成功或一起失敗。
事務必須透過發出Begin Transaction語句顯式建立。後續語句在發出Commit或Commit Transaction語句之前不會提交到資料庫。如果發出Rollback或Rollback Transaction語句,則自事務開始以來的所有語句都將失敗,即這些語句都不會提交到資料庫。
Begin Transaction
go
Insert Into U1 (a, b, c) Values (1, 'First', 'Row')
go
Rollback Transaction
go
Select * From U1
go
(0 row(s) returned)
當使用 Microsoft 的 ADO 資料庫元件時,事務通常透過這些物件上的 BeginTrans / CommitTrans / RollbackTrans 方法管理。但是,它們也可以透過語句執行輕鬆實現,如上所示。
JET 支援對資料庫進行讀和寫鎖定,可以透過獨佔訪問或共享訪問來實現。鎖定可以在行級別、頁面級別或資料庫級別設定。
從 JET 4.0 開始,當鎖定的行數達到閾值時,行級鎖定將自動提升到頁面級或表級。此閾值在 Windows 登錄檔項PagesLockedToTableLock中設定,該項位於金鑰HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet 4.0下
鎖定可以透過設定資料庫連線上的隔離級別來配置。對於 ADO,這是透過Connection物件上的IsolationLevel屬性來完成的。