程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> 使用 DB2 對象:創建約束

使用 DB2 對象:創建約束

編輯:更多數據庫知識

  約束使 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 —— 修改表

  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 —— 創建表

  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、注意以下條件:

  • 每個人可以多次測試多個模塊
  • 測試分數應該在 0 到 100 之間
  • HWLD.PARTICIPANT 中的 MODULE_ID 應該引用 HWLD.MODULE 中的 MODULE_ID。當從表 HWLD.MODULE 中刪除一個模塊時,將 PARTICIPANT 表中對應的 MODULE_ID 設置為 NULL,所以 NULL 值在這裡不會是無效的 MODULE_ID 值。
  • 當在 HWLD.PARTICIPANT 表中插入一行時,如果它的 MODULE_ID 在 HWLD.MODULE 中不存在,那麼插入失敗。
  • 當更新表 HWLD.MODULE 中的一個模塊時,如果 HWLD.PARTICIPANT 表中存在著引用這個 MODULE_ID 的記錄,那麼更新失敗。

  8、添加以下約束來實施前面的條件:

  • 列 PAR_TEST_SCORE 上的檢查約束確保它的值在 0 到 100 之間
  • MODULE_ID 上的外鍵引用 HWLD.MODULE 中的 MODULE_ID,並設置 ON DELETE SET NULL,ON UPDATE RESTRICT(注意,關於插入的第 4 條規則在默認情況下已經實施了)。

  可以在創建表 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 向導 —— 列

  Create Table 向導 —— 列

  14、點擊 Next。再次點擊 Next 跳過 Data Partitions 頁面。

  15、與前面創建的兩個表相似,表 HWLD.PARTICIPANT 也為數據和索引使用單獨的表空間。選擇 TBSP_DATA1 作為數據的表空間,選擇 TBSP_INDEX1 作為索引的表空間。點擊 Next。

  16、在 Keys 頁面上,點擊 Add Foreign。輸入 PMID_FOR 作為外鍵名。

  圖4. Create Table 向導 —— 添加外鍵

  Create Table 向導 —— 添加外鍵

  17、選擇 HWLD.MODULE 作為父表。在 Available columns 中選擇 MODULE_ID,並點擊 > 將它添加為外鍵。對於 On delete 選擇 SET NULL,對於 On update 選擇 RESTRICT。點擊 OK。應該會看到定義了以下約束:

  圖5. Create Table 向導 —— 鍵

  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. 剛創建的表及其約束

  剛創建的表及其約束

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved