條件約束

條件約束 (Constraint) 可讓您定義 Database Engine自動強制資料庫完整性的方式。條件約束是定義有關資料行中允許值的規則,是強制完整性的標準機制。使用時,條件約束應優先於 DML 觸發程序規則 以及預設值。查詢最佳化工具也使用條件約束定義來建立高效能的查詢執行計畫。

條件約束的類別

SQL Server 支援下列條件約束的類別:

  • NOT NULL 指定資料行不接受 NULL 值。如需詳細資訊,請參閱<允許 Null 值>。

  • CHECK 條件約束限制資料行中可接受的值,藉此強制網域完整性。如需詳細資訊,請參閱<CHECK 條件約束>。

    CHECK 條件約束可指定布林 (Boolean) (評估為 TRUE、FALSE 或未知) 搜尋條件,該條件是用以套用至輸入資料行的所有值。所有評估為 FALSE 的值都會遭拒絕。您可以為每個資料行指定多個 CHECK 條件約束。下列範例顯示建立 chk_id 條件約束。此條件約束可確保所輸入的索引鍵是在指定範圍內的數字,以額外強制主索引鍵的值域。

    CREATE TABLE cust_sample
       (
       cust_id            int      PRIMARY KEY,
       cust_name         char(50),
       cust_address         char(50),
       cust_credit_limit   money,
       CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 )
       )
    
  • UNIQUE 條件約束會強制一組資料行中數值的唯一性。

    在 UNIQUE 條件約束中,資料表中的任兩個資料列之資料行不能包含相同的值。主索引鍵也會強制唯一性,但主索引值不允許 Null 做為其中一個唯一值。如需詳細資訊,請參閱<UNIQUE 條件約束>。

  • PRIMARY KEY 條件約束指出哪個資料行或資料行集合的值可以唯一識別資料表中的資料列。如需詳細資訊,請參閱<PRIMARY KEY 條件約束>。

    資料表中的任何兩個資料列不得擁有相同的主索引鍵值。主索引鍵中的任何資料行均不得輸入 NULL。我們建議您使用小的整數資料行做為主索引鍵。每個資料表都應該有一個主索引鍵。可做為主索引鍵的資料行或資料行組合又稱為候選索引鍵。

    下列範例建立 part_sample 資料表並指定 part_nmbr 欄位做為主索引鍵。

    CREATE TABLE part_sample
             (part_nmbr      int         PRIMARY KEY,
             part_name      char(30),
             part_weight      decimal(6,2),
             part_color      char(15) );
    
  • FOREIGN KEY 條件約束識別和強制資料表之間的關係。如需詳細資訊,請參閱<FOREIGN KEY 條件約束>。

    一個資料表中的外部索引鍵指向另一個資料表中的候選索引鍵。在下列範例中,order_part 資料表建立外部索引鍵,以參考先前所定義的 part_sample 資料表。

    CREATE TABLE order_part
          (order_nmbr      int,
          part_nmbr      int
             FOREIGN KEY REFERENCES part_sample(part_nmbr)
                ON DELETE NO ACTION,
          qty_ordered      int);
    GO
    

    如果候選索引鍵沒有某個值 (NULL 除外),您就無法插入包含該外部索引鍵值的資料列。當您試圖刪除的資料列有現有的外部索引鍵指向它時,ON DELETE 子句會控制應採取的動作。ON DELETE 子句有兩個選項:

    • NO ACTION 指定刪除動作失敗,傳回錯誤。

    • CASCADE 指定所有資料列 (其外部索引鍵指向刪除的資料列) 也都要一併刪除。

    • SET NULL 指定將外部索引鍵指向已刪除資料列的所有資料列設為 NULL。

    • SET DEFAULT 指定將外部索引鍵指向已刪除資料列的所有資料列設為預設值。如需詳細資訊,請參閱<預設值>。

    當您試圖更新的候選索引鍵有現有的外部索引鍵指向它時,ON UPDATE 子句會控制應採取的動作。此子句也支援 NO ACTION、CASCADE、SET NULL 以及 SET DEFAULT 選項。

資料行與資料表條件約束

條件約束可以是資料行條件約束或資料表條件約束。資料行條件約束是指定為資料行定義的一部份並且只能套用至該資料行。在前例中的條件約束為資料行條件約束。資料表條件約束是獨立於資料行定義外宣告的,它可以套用至資料表中的多個資料行。當條件約束中必須包含多個資料行時,就必須使用資料表條件約束。

例如,如果資料表的主索引鍵有二或多個資料行,您必須使用資料表條件約束將兩個資料行同時納入主索引鍵中。請考慮一個資料表記錄著工廠的電腦中所發生的事件。假設有些類型的事件可以同時發生,但是同時發生的兩個事件不可以是相同類型。這可在資料表中強制,即在兩個資料行的主索引鍵中同時包含 event_type 與 event_time 資料行,如下列範例所顯示。

CREATE TABLE factory_process
   (event_type   int,
   event_time   datetime,
   event_site   char(50),
   event_desc   char(1024),
CONSTRAINT event_key PRIMARY KEY (event_type, event_time) )

請參閱

參考

其他資源