共用方式為


ALTER TABLE column_constraint (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體

指定 PRIMARY KEY、FOREIGN KEY、UNIQUE 或 CHECK 條件約束的屬性,而這些條件約束是使用 ALTER TABLE 新增至資料表之新資料行定義的一部分。

Transact-SQL 語法慣例

Syntax

Microsoft Fabric 中 SQL Server、Azure SQL 資料庫、Azure SQL 受控執行個體、SQL 資料庫的語法

[ CONSTRAINT constraint_name ]   
{   
    [ NULL | NOT NULL ]   
    { PRIMARY KEY | UNIQUE }   
        [ CLUSTERED | NONCLUSTERED ]   
        [ WITH FILLFACTOR = fillfactor ]   
        [ WITH ( index_option [, ...n ] ) ]  
        [ ON { partition_scheme_name (partition_column_name)   
            | filegroup | "default" } ]   
    | [ FOREIGN KEY ]   
        REFERENCES [ schema_name . ] referenced_table_name   
            [ ( ref_column ) ]   
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]   
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]   
        [ NOT FOR REPLICATION ]   
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )  
}  

Microsoft網狀架構倉儲的語法

[ CONSTRAINT constraint_name ]  
{  
    { PRIMARY KEY | UNIQUE }  
       NONCLUSTERED    
        (column [ ASC | DESC ] [ ,...n ] )  
NOT ENFORCED
    | FOREIGN KEY  
        ( column [ ,...n ] )  
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]  
NOT ENFORCED
}  

引數

CONSTRAINT

指定開始定義 PRIMARY KEY、UNIQUE、FOREIGN KEY 或 CHECK 條件約束。

constraint_name
這是條件約束的名稱。 條件約束名稱必須遵照識別碼的規則,不過,名稱開頭不能是數字符號 (#)。 如果未提供 constraint_name,就會將系統產生的名稱指派給條件約束。

NULL | NOT NULL

指定資料行是否接受 Null 值。 不允許 NULL 的資料行必須指定了預設值,才能夠加入。 如果新資料行允許 Null 值,且未指定預設值,資料表每個資料列的新資料行都會包含 NULL。 如果新資料行允許 Null 值,且加入了預設定義,就可以利用 WITH VALUE 選項,將預設值儲存在資料表每個現有資料列的新資料行中。

如果新資料行不允許 Null 值,就必須隨著新資料行加入 DEFAULT 定義。 這個新資料行會在現有資料列的各個新資料行中,自動載入預設值。

當加入資料行需要實際變更資料表的資料列時,例如,在每個資料列中加入 DEFAULT 值,執行 ALTER TABLE 會保留資料表的鎖定。 這會影響在鎖定就緒時,變更資料表內容的能力。 相對地,加入允許 Null 值且未指定預設值的資料行,只是一項中繼資料作業,不含任何鎖定。

當您使用 CREATE TABLE 或 ALTER TABLE 時,資料庫和工作階段設定值會影響且可能會覆寫資料行定義所用之資料類型的 Null 屬性。 我們建議您一律將非計算資料行明確定義為 NULL 或 NOT NULL,如果您採用使用者自訂資料類型,建議您允許資料行使用資料類型的預設 Null 屬性。 如需詳細資訊,請參閱 CREATE TABLE

PRIMARY KEY

這是一個條件約束,它會利用唯一索引來強制執行一個或多個指定之資料行的實體完整性。 每份資料表都只能建立一個 PRIMARY KEY 條件約束。

UNIQUE

這是一個條件約束,它利用唯一索引來提供一個或多個指定之資料行的實體完整性。

CLUSTERED | NONCLUSTERED

指定建立 PRIMARY KEY 或 UNIQUE 條件約束的叢集或非叢集索引。 PRIMARY KEY 條件約束預設為 CLUSTERED。 UNIQUE 條件約束預設為 NONCLUSTERED。

如果叢集條件約束或索引已在資料表中,就無法指定 CLUSTERED。 如果叢集條件約束或索引已在資料表中,PRIMARY KEY 條件約束便預設為 NONCLUSTERED。

屬於 ntexttextvarchar(max)nvarchar(max)varbinary(max)xmlimage 資料類型的資料行無法指定為索引的資料行。

在Microsoft網狀架構倉儲中,NONCLUSTERED 沒有任何作用。

WITH FILLFACTOR =fillfactor

指定用來儲存索引資料的每個索引頁面,資料庫引擎所應加以填滿的程度。 使用者指定的填滿因數可以是從 1 到 100 的值。 如果未指定值,預設值為 0。

重要

WITH FILLFACTOR記錄為套用至 PRIMARY KEY 或 UNIQUE 條件約束的唯一索引選項,是為了回溯相容性而維持,但未來版本不會以這種方式記載。 您可以在 ALTER TABLE 的 index_option 子句中,指定其他索引選項。

ON { partition_scheme_namepartition_column_name | filegroup | default }

適用於:SQL Server 2008 (10.0.x) 和更新版本。

指定條件約束所建立之索引的儲存位置。 如果指定 partition_scheme_name,索引就會進行資料分割,這些資料分割會對應於 partition_scheme_name 所指定的檔案群組。 如果指定了 filegroup,就會在具名檔案群組中建立索引。 如果指定了 "default",或完全未指定 ON,就會在與資料表相同的檔案群組中建立索引。 如果加入 PRIMARY KEY 或 UNIQUE 條件約束的叢集索引時指定了 ON,則建立叢集索引時,會將整份資料表移到指定的檔案群組中。

在這個內容中,default 不是關鍵字。 它是預設檔案群組的識別碼,必須加以分隔,例如 ON defaultON [default]。 如果 指定預設值 ,則 QUOTED_IDENTIFIER 目前會話的選項必須為 ON。 這是預設值。 如需詳細資訊,請參閱 SET QUOTED_IDENTIFIER (Transact-SQL)

NOT ENFORCED

在Microsoft網狀架構倉儲中,主鍵、唯一索引鍵和外鍵條件約束需要NOT ENFORCED。 應用程式必須維護條件約束的完整性。

FOREIGN KEY REFERENCES

這是一個條件約束,它提供資料行中之資料的參考完整性。 FOREIGN KEY 條件約束要求數據行中的每個值都存在於參考數據表中指定的數據行中。

schema_name
這是 FOREIGN KEY 條件約束參考之資料表所屬的結構描述名稱。

referenced_table_name
這是 FOREIGN KEY 條件約束所參考的資料表。

ref_column
這是新 FOREIGN KEY 條件約束所參考的資料行,用括號括住。

ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

指定如果變更的資料表中之資料列有參考關聯性,且在父資料表中刪除了所參考的資料列,變更的資料表中之資料列會發生什麼動作。 預設值是 NO ACTION。

NO ACTION
SQL Server 資料庫引擎會產生一則錯誤,且會復原父資料表中資料列的刪除動作。

CASCADE
如果從父資料表中刪除資料列,便會從進行參考的資料表中刪除對應的資料列。

SET NULL
當刪除父資料表中對應的資料列時,所有組成外部索引鍵的值都會設為 NULL。 若要執行這個條件約束,外部索引鍵資料行必須可為 Null。

SET DEFAULT
當刪除父資料表中對應的資料列時,所有組成外部索引鍵的值都會設為預設值。 若要執行這個條件約束,所有外部索引鍵資料行都必須有預設定義。 如果有可為 Null 的資料行,但沒有設定明確的預設值,NULL 便成為這個資料行的隱含預設值。

如果資料表要包含在使用邏輯記錄的合併式發行集中,請勿指定 CASCADE。 如需邏輯記錄的詳細資訊,請參閱使用邏輯記錄分組相關資料列的變更

如果變更的資料表已有 INSTEAD OF 觸發程序 ON DELETE,便無法定義 ON DELETE CASCADE。

例如,在 AdventureWorks2022 資料庫中,ProductVendor 資料表與 Vendor 資料表有參考關聯性。 ProductVendorVendorID 外鍵會參考 VendorVendorID 主鍵。

如果 DELETE 語句是在資料表中的數據Vendor列上執行,且已針對 ProductVendorVendorID指定 ON DELETE CASCADE 巨集指令,則 資料庫引擎 會檢查數據表中的ProductVendor一或多個相依數據列。 如果有的話,除了數據表中所參考的數據列之外,也會刪除數據表中的Vendor相依ProductVendor數據列。

相反地,如果指定 NO ACTION,則 資料庫引擎 會引發錯誤,並在數據表中至少有一個參考它的數據列時,回復數據列上的ProductVendor刪除動作Vendor

ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

指定當變更的資料表中之資料列有參考關聯性,且在父資料表中所參考的資料列有了更新時,變更的資料表中之資料列會發生什麼動作。 預設值是 NO ACTION。

NO ACTION
資料庫引擎會產生一則錯誤,且會復原父資料表中資料列的更新動作。

CASCADE
當父資料表中的資料列有了更新時,在進行參考的資料表中,也會更新對應的資料列。

SET NULL
當父資料表中的對應資料列更新時,組成外鍵的所有值都會設定 NULL 為 。 若要執行這個條件約束,外部索引鍵資料行必須可為 Null。

SET DEFAULT
當更新父資料表中對應的資料列時,所有組成外部索引鍵的值都會設為預設值。 若要執行這個條件約束,所有外部索引鍵資料行都必須有預設定義。 如果數據行可為 Null,而且沒有明確的預設值設定, NULL 就會成為數據行的隱含預設值。

如果資料表要包含在使用邏輯記錄的合併式發行集中,請勿指定 CASCADE。 如需邏輯記錄的詳細資訊,請參閱使用邏輯記錄分組相關資料列的變更

如果在 INSTEAD OF 觸發程序 ON UPDATE 已經存在已警示的資料表,則無法定義ON UPDATE CASCADE、SET NULL、或 SET DEFAULT。

例如,在 AdventureWorks2022 資料庫中,ProductVendor 資料表與 Vendor 資料表有參考關聯性。 ProductVendorVendorID 外鍵會參考 VendorVendorID 主鍵。

如果在數據表中的數據Vendor列上執行 UPDATE 語句,且ON UPDATE CASCADE已針對 ProductVendorVendorID指定動作,則 資料庫引擎 會檢查數據表中的ProductVendor一或多個相依數據列。 如果有的話,除了數據表中所Vendor參考的數據列之外,數據表中的ProductVendor相依數據列也會更新。

相反地,如果指定 NO ACTION,則 資料庫引擎 會引發錯誤,並在數據表中至少有一個參考它的數據列時,回復數據列上的ProductVendor更新動作Vendor

NOT FOR REPLICATION
適用於:SQL Server 2008 (10.0.x) 和更新版本。

可以指定給 FOREIGN KEY 條件約束和 CHECK 條件約束。 如果條件約束指定了這個子句,當複寫代理程式執行插入、更新或刪除作業時,不會強制執行這個條件約束。

CHECK

這是一個條件約束,藉由限制可能輸入一個或多個資料行的值,強制執行範圍完整性。

logical_expression
CHECK 條件約束所使用的邏輯運算式,會傳回 TRUE 或 FALSE。 搭配 CHECK 條件約束使用的 logical_expression 無法參考其他資料表,但可以參考相同資料列所在之資料表的其他資料行。 這個運算式不能參考別名資料類型。

備註

新增FOREIGN KEY或 CHECK 條件約束時,除非指定選項,否則 WITH NOCHECK 所有現有的數據都會驗證條件約束違規。 如果有任何違規,ALTER TABLE 便會失敗,且會傳回錯誤。 當現有資料行中加入了新的 PRIMARY KEY 或 UNIQUE 條件約束時,資料行中的資料便必須是唯一的。 如果找到重複的值,ALTER TABLE 便會失敗。 新增 PRIMARY KEY 或 UNIQUE 條件約束時,此選項 WITH NOCHECK 不會有任何作用。

每個 PRIMARY KEY 和 UNIQUE 條件約束都會產生一個索引。 UNIQUE 和 PRIMARY KEY 條件約束數目無法使資料表的索引數目超出 999 個非叢集索引和 1 個叢集索引。 外部索引鍵條件約束不會自動產生索引。 但外部索引鍵資料行常會用於查詢的聯結準則,方法是將資料表的外部索引鍵條件約束與其他資料表的主要或唯一索引鍵資料行進行比對。 外部索引鍵資料行的索引可讓資料庫引擎快速從外部索引鍵資料表中尋找相關資料。

範例

如需範例,請參閱 ALTER TABLE (Transact-SQL)