關系模型的數據完整性主要是為了保證數據不會被破壞,具體有可以分為域完整性、實體完整性、參照完整性和用戶定義完整性,其中用戶定義完整性是指用戶在具體的應用環境下對數據庫提出的約束要求。本小節主要關注SQL語言中關于域完整性、實體完整性和參照完整性的實現方法,如表2-6所示。
表2-6 基本表的數據組織形式
名稱
方法
描述
域完整性
NULL約束
可以指定一個列中的值是否可以為NULL
CHECK約束
用來檢查輸入的值是否滿足某一約束條件
約束
如果輸入數據中沒有指定該列具體的值,可以直接使用約束指定的默認值
實體完整性
主鍵
指定的鍵值組合在集合內只能有唯一的一個值(不可以包含NULL值)
約束
指定的鍵值組合在集合內只能有唯一的一個值(可以包含NULL值)
參照完整性
外鍵
指定的鍵值組合和外部的鍵值相對應
在創建基本表的同時,還可以指定表中數據完整性約束,例如在創建基本表時,通過分析可以得到如下結論:
不同的信息必須有不同的w_id,且w_id不能為NULL。
必須有具體的名字,不能為NULL。
所在的街區地址的長度不能為0。
所在的國家默認為‘CN’。
因此可以在創建基本表時指定如下約束:
例2-7:創建帶有完整性約束的基本表,具體語句如下:
TABLE
(
w_id KEY,
(10) NOT NULL,
(20) CHECK (() 0),
(20) CHECK (() 0),
(20),
CHAR(2) ‘CN’,
w_zip CHAR (9),
w_tax (4,2),
w_ytd (12,2)
);
如果向基本表中寫入不符合完整性約束的值,那么數據不能被寫入數據庫參照完整性,數據庫會提示錯誤。
例2-8:向列中寫入NULL值,不符合完整性約束,具體語句如下:
INTO (1, NULL, '', '', NULL, 'CN', NULL, 1.0, 1.0);
ERROR: null value in "" not-null
: row (1, null, null, null, null, CN, null, null, null).
除了在列定義之后指定完整性約束之外,還可以在使用表級的完整性約束來指定。
例2-9:在表定義上指定完整性約束,注意NULL約束只能在列定義上指定,具體語句如下:
TABLE
(
w_id ,
(10) NOT NULL, -- 設置NULL約束
(20),
(20),
(20),
CHAR(2) ‘CN’, -- 設置默認值
w_zip CHAR (9),
w_tax (4,2),
w_ytd (12,2),
KEY(w_id), --增加主鍵約束
--增加CHECK約束
CHECK(() < 100),
CHECK(() < 100),
);
當一個表中的某一個列或一組列恰好引用的是另一個表的主鍵(或具有唯一性)時數據庫參照完整性,可以考慮將其定義為外鍵,外鍵表示兩個表之間的相互的關聯關系,包含主鍵的表通常可以成為主表,而包含外鍵的表則可以被成為從表。外鍵的定義可以直接在屬性上定義,也可以在基本表的創建語句中定義,兩種方法本質上沒有區別。
例2-10:新訂單表()中引用了倉庫表()的列做外鍵,具體語句如下:
TABLE
(
NOT NULL,
NOT NULL,
NOT NULL (w_id)
);
TABLE
(
NOT NULL,
NOT NULL,
NOT NULL,
KEY () (w_id)
);
除了在創建基本表的同時指定完整性約束之外,還可以通過ALTER TABLE語句對完整性約束進行修改。
例2-11:在基本表上增加主鍵列,具體語句如下:
ALTER TABLE ADD KEY(w_id);
例2-12:在基本表上增加CHECK約束,具體語句如下:
ALTER TABLE ADD CHECK (() < 100);
例2-13:在基本表上增加外鍵引用,具體語句如下:
ALTER TABLE ADD KEY () (w_id);
例2-14:在基本表上增加唯一列,具體語句如下:
ALTER TABLE ADD (, , );