語法
單一欄位條件:
CONSTRAINT名 {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES 外部表 [(外部欄位1,外部欄位2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
多重欄位條件:
CONSTRAINT名
CONSTRAINT name
{PRIMARY KEY (primary1[, primary2 [, ...]])|
|
UNIQUE (unique1[, unique2 [, ...]])|
|
NOT NULL (notnull1[, notnull2 [, ...]])|
FOREIGN KEY [NO INDEX] (ref1 [, ref2 [, ...]])REFERENCES foreigntable [(foreignfield1 [, foreignfield2 [, ...]])]}
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
子句可分為以下幾個部分:
部分 說明
name 欲創建的條件的名稱。
primary1, primary2 被指定為主鍵.的欄位名。
unique1, unique2 欲設計成為唯一鍵的一個或多個欄位之名稱。
notnull1, notnull2 被限制為非 Null 值的欄位的名稱。
ref1, ref2 涉及到另一個表中的欄位的外部鍵欄位名
foreigntable 包含由外部欄位註明的欄位的外部表名。
foreignfield1, foreignfield2 由 ref1、ref2 指定的 foreigntable 中的欄位的名稱。如果引用的欄位是 foreigntable 的主鍵,則可省略此子句。
說明
緊接在欄位的數據類型規格之後,在 ALTER TABLE 或 CREATE TABLE 語句的欄位定義子句中,使用單一欄位條件之語法。
只要在 ALTER TABLE 或 CREATE TABLE 語句的欄位定義子句之外使用保留字 CONSTRAINT,就可以使用多重欄位條件之語法。
將欄位設計為如下的條件類型之一:
可以使用 UNIQUE 保留字將欄位設計為唯一鍵。這意味著在同一個表中沒有兩個記錄的這個欄位的值是相同的。可以強制任何欄位或欄位列表為唯一的。如果多重欄位條件被設計成唯一鍵,在索引之中的所有欄位的組合值必須也是唯一的,即使在這些欄位之中有兩個或兩個以上的記錄有相同的值。
可以用 PRIMARY KEY 保留字,將表中的欄位或一組欄位設計為主鍵。在主鍵之中所有的值必須是唯一的,且不可為 Null,一個表只能有一個主鍵。
注意
在一個已經設有主鍵的表中,不能再設定 PRIMARY KEY 條件,否則會發生錯誤。
您可以使用 FOREIGN KEY 保留字將一個欄位設定為外部鍵。如果外部表的主鍵是由一個以上的欄位所組成,則必須使用多重欄位條件定義,列出全部的引用欄位、外部表名、以及以列出引用欄位相同的順序在外部表中列出引用欄位的名稱。若所引用的欄位是外部表的主鍵,則無須指定所引用的欄位。根據默認,資料庫引擎在認為外部表的主鍵是所引用欄位的情況下執行操作。
外部鍵條件限定具體的活動在一個相應的主鍵值被改變時來執行:
你可以指定外部表上執行的活動,此活動基於一個在定義了CONSTRAINT的表中主鍵上執行的相應的活動。例如,考慮以下對“客戶”表的定義
CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
考慮表的以下定義,定義外部鍵與Customers表的主鍵關係的順序為:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE
ON UPDATE CASCADE 和 ON DELETE CASCADE 子句都定義於外部鍵上。 ON UPDATE CASCADE 子句的含義是:如果用戶的標識符(CustId)在用戶表中更新,此更新將通過順序表級聯。各個含有相套用戶標識符值的順序隨著新值自動更新。 ON DELETE CASCADE 子句的含義是:如果一個用戶被從用戶表中刪除,順序表中所有包含同樣用戶標識符值的位序也會被刪除。
考慮到表中下列不同的定義,用 SET NULL 活動代替CASCADE活動的順序為:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL
ON UPDATE SET NULL 子句的含義是:如果用戶的標識符 (CustId) 在用戶表中更新,順序表中相應的外部鍵值將會被自動設為 NULL。相似地,ON DELETE SET NULL 子句的含義是:如果一個用戶被從用戶表中刪除,順序表中所有相應的外部鍵將會被自動設為NULL。
為阻止外部鍵索引的自動生成,可使用變址器 NO INDEX。這一形式的外部鍵定義僅用於經常要複製形成索引值的情況。在外部鍵索引中的數值經常被複製的場合,使用索引不如直接進行表搜尋有效。對這種索引和表中插入和刪除的行列的維護會降低性能,沒有任何好處。