CONSTRAINT 子句

限制式與索引相似,但前者還能與其他資料表用來建立關聯圖。

您可以在 ALTER TABLE 和 CREATE TABLE 陳述式中使用 CONSTRAINT 子句來建立或刪除限制式。CONTRAINT 子句有兩種類型:一種用來在單一欄位建立限制式,另一種則用於在多個欄位建立限制式。

附註: Microsoft Access 資料庫引擎不支援搭配非 Microsoft Access 資料庫使用 CONSTRAINT 或任何資料定義語言陳述式。請改為使用 DAO Create 方法。

語法

單一欄位限制式:

CONSTRAINT name {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES foreigntable [(foreignfield1, foreignfield2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}

多欄位限制式:

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]}

CONSTRAINT 子句有三個部分:

部分

描述

name

要建立的限制式名稱。

primary1, primary2

要指定主索引鍵的欄位名稱。

unique1, unique2

要指定為唯一索引鍵的欄位。

notnull1, notnull2

限定為只能使用非 Null 值的欄位名稱。

ref1, ref2

參照其他資料表欄位的外部索引鍵欄位名稱。

foreigntable

包含 foreignfield 所指定欄位的外部資料表名稱。

foreignfield1, foreignfield2

ref1ref2 指定的 foreigntable 中的欄位名稱。如果參照的欄位是 foreigntable 的主索引鍵,則可省略此子句。


備註

您可以按照欄位的資料類型規格,立即在 ALTER TABLE 或 CREATE TABLE 陳述式的欄位定義子句中使用單一欄位限制式語法。

多欄位限制式語法則適用於在 ALTER TABLE 或 CREATE TABLE 陳述式中的欄位定義子句外部使用保留字 CONSTRAINT 的情況。

您可以使用 CONSTRAINT 指定為下列任何一種限制式:

  • UNIQUE 保留字可用於將欄位指定為唯一索引鍵。這表示資料表中不得有任何記錄在此欄位包含相同的值。您可以將任何欄位或欄位清單限定為唯一。如果多欄位限制式指定為唯一索引鍵,索引中所有欄位的合併值就必須是唯一,即使兩筆或多筆記錄在任一欄位中包含相同值。

  • PRIMARY KEY 保留字可用於將資料表中的單一欄位或一組欄位指定為主索引鍵。主索引鍵中的所有值都必須是唯一,且不得為 Null;資料表只能有一個主索引鍵。

    附註: 請勿在已經包含主索引鍵的資料表中設定 PRIMARY KEY 限制式;如果您這麼做,則會發生錯誤。

  • FOREIGN KEY 保留字可用於將欄位指定為外部索引鍵。如果外部資料表的主索引鍵包括多個欄位,您就必須使用多欄位限制式定義,按照參照欄位的排列順序列出所有參照欄位、外部資料表名稱,以及外部資料表中的參照欄位名稱。如果參照的欄位是外部資料表的主索引鍵,則您不必指定參照欄位。根據預設,資料庫引擎會將外部資料表的主索引鍵當成參照欄位。

    外部索引鍵限制式會定義要在對應的主索引鍵值有變更時執行的特定動作:

  • 您可以根據對已定義 CONSTRAINT 之資料表中的主索引鍵所執行的對應動作,指定要對外部資料表執行的動作。例如,假設「客戶」資料表的定義如下所示:

CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))

請使用以下的「訂單」資料表定義,當中定義了參照「客戶」資料表主索引鍵的外部索引鍵關係:

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。這種外部索引鍵定義僅適用於產生的索引值經常重複的情況。如果外部索引鍵索引值經常重複,使用索引的效率就會比執行資料表掃描來得差。維護這種索引 (在資料表中插入和刪除列) 會導致成效下降,且無法提供任何優點。



擴展您的技能
探索訓練
優先取得新功能
加入 Office 測試人員

這項資訊有幫助嗎?

感謝您的意見反應!

感謝您的意見反應! 我們將協助您與其中一位 Office 支援專員連絡以深入了解您的意見。

×