約束使 DBMS 能夠防止不正確的或意外的數據輸入表中,從而確保表中數據的完整性。DB2 中使用以下約束實施數據完整性:
主鍵(Primary key)
用來確保一個列或一組列的值的惟一性。每個表只能有一個主鍵。
外鍵(Foreign key)或稱為引用約束(referential constraint)
用來在兩個表之間建立引用關系,這兩個表通常稱為子表和父表,用來建立引用關系的操作在 REFERENCE 子句中定義。當在父表或子表中插入/刪除/更新的數據滿足預定義的條件時,就執行這個操作。外鍵總是應該引用父表中的主鍵或惟一鍵。
惟一鍵(Unique key)
用來確保一個列或一組列的值的惟一性。與主鍵相反,一個表可以有多個惟一鍵。惟一鍵還使外鍵能夠引用主鍵之外的數據列。每當定義主鍵或惟一鍵時,就會創建惟一索引。
檢查約束(Check constraint)
在表級上針對一個或多個表列定義檢查約束,它們可以對這些表列實施指定的規則,使這些列中插入或更新的數據滿足檢查約束中預先定義的條件。與其他約束不同,檢查約束可以在某些操作期間臨時關閉,比如 LOAD,在對約束進行檢查之前,表處於檢查未決狀態。
可以在創建表時創建約束,也可以使用 ALTER TABLE 語句或 GUI 界面在以後添加約束。
以下練習演示如何創建和使用這些約束。它還演示如何使用 Command Editor 執行一些日常管理任務:
1、在 Control Center 主菜單中,點擊 Tools > Command Editor。出現 Command Editor 窗口。使用這個編輯器編輯 DB2 命令,執行它們,然後查看返回的 DB2 或 SQL 消息。
2、首先在 AUTHOR 表中添加另一個列,然後在這個表上添加一個主鍵。添加以下命令並點擊圖1 所示的綠色執行按鈕:
圖1 Command Editor —— 修改表
在添加主鍵時,由於 AUTHOR_ID 上已經有了一個惟一索引, DB2 要在幕後創建一個惟一索引。 DB2 為這個主鍵使用現有的索引,並返回 SQL0598W。
3、在 Command Editor 中,還可以選擇將現有命令保存到文件中,或者用接下來要編輯或運行的新命令替換它們。
4、將 Command Editor 窗口中的命令替換為以下命令:
CONNECT TO HWLD;
CREATE TABLE HWLD.MODULE
( MODULE_ID INT NOT NULL,
MODULE_NAME CHAR(20) NOT NULL,
PRIMARY KEY (MODULE_ID),
CONSTRAINT MID_UNIQ UNIQUE
(MODULE_ID, MODULE_NAME),
CONSTRAINT MID_CHECK CHECK (MODULE_ID >= 0)
)
IN TBSP_DATA1 INDEX IN TBSP_INDEX1;
CONNECT RESET;
5、這個 CREATE TABLE 命令在創建表期間創建一個主鍵約束、一個惟一鍵約束和一個檢查約束。檢查約束要求數據列 MODULE_ID 中的值都是正數。圖2顯示預期的運行結果:
圖 2. Command Editor —— 創建表
可以使用 CREATE TABLE 向導完成同樣的任務。
6、現在,已經創建了兩個表。表 HWLD.AUTHOR 包含 Hello World 模塊的所有作者信息。表 HWLD.MODULE 包含所有 Hello World 系列模塊信息。現在,創建另一個表 HWLD.PARTICIPANT,它包含所有參與者的信息,包括姓名、部門(可選)、參與的模塊和測試分數。
表 HWLD.PARTICIPANT 應該具有以下的表定義:
(PAR_NAME VARCHAR(50) NOT NULL,
PAR_ID BIGINT NOT NULL,
PAR_AREA CHAR(20),
MODULE_ID INT,
PAR_TEST_SCORE INT)
7、注意以下條件:
8、添加以下約束來實施前面的條件:
可以在創建表 HWLD.PARTICIPANT 時創建這些約束。
9、在 Control Center 中,從 Tables 視圖啟動 Create New Table 向導。選擇 HWLD 作為表模式,輸入 PARTICIPANT 作為表名,並添加注釋。點擊 Next。
10、在 Columns 頁面上,點擊 Add 添加第一個列。指定 PAR_NAME VARCHAR(50) NOT NULL 並選擇 VARCHAR 作為數據類型。
11、點擊 OK。在 Columns 頁面上,添加第二個列 PAR_ID BIGINT NOT NULL。點擊 OK。添加第三個列 PAR_AREA CHAR(20)。注意,這個列允許 NULL 值。
12、同樣,添加第四個列 MODULE_ID INT 和第五個列 PAR_TEST_SCORE INT。它們的數據類型都是 INTEGER,都允許 NULL 值。
13、檢查已經添加的列。
圖3. Create Table 向導 —— 列
14、點擊 Next。再次點擊 Next 跳過 Data Partitions 頁面。
15、與前面創建的兩個表相似,表 HWLD.PARTICIPANT 也為數據和索引使用單獨的表空間。選擇 TBSP_DATA1 作為數據的表空間,選擇 TBSP_INDEX1 作為索引的表空間。點擊 Next。
16、在 Keys 頁面上,點擊 Add Foreign。輸入 PMID_FOR 作為外鍵名。
圖4. Create Table 向導 —— 添加外鍵
17、選擇 HWLD.MODULE 作為父表。在 Available columns 中選擇 MODULE_ID,並點擊 > 將它添加為外鍵。對於 On delete 選擇 SET NULL,對於 On update 選擇 RESTRICT。點擊 OK。應該會看到定義了以下約束:
圖5. Create Table 向導 —— 鍵
點擊 Next。(在這裡,可以創建不同類型的鍵,比如惟一鍵和主鍵。在這個練習中,只創建一個外鍵。)
18、再次點擊 Next 跳過 Dimensions 頁面。
19、在 Define Check Constraints 頁面上,點擊 Add 啟動 Add Check Constraint 向導。
20、輸入 PAR_SCORE_CHECK 作為檢查約束名。添加以下代碼作為檢查條件: PAR_TEST_SCORE BETWEEN 0 and 100
選擇兩個約束屬性。
21、輸入注釋。點擊 OK 添加這個約束。點擊 Finish。在 DB2 Message 窗口中應該會返回 DB20000。關閉它。
22、檢查新創建的 PARTICIPANT 表是否顯示在 Control Center 中。
回顧 HWLD.PARTICIPANT,考慮您是否能夠想出可以用約束實現的其他條件。(提示:當前的實現對於參與者以及分配給他們的參與者 ID 沒有要求惟一性;實現這一條件有兩種方法。一種是將當前的 HWLD.PARTICIPANT 表分割成兩個表,對參與者 ID 實施惟一性約束,並建立引用參與者 ID 的外鍵。您能想出另一種方法嗎?)
下圖總結了前面創建的三個表以及在其中添加的約束。
圖6. 剛創建的表及其約束