適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
指定 PRIMARY KEY、FOREIGN KEY、UNIQUE 或 CHECK 條件約束的屬性,而這些條件約束是使用 ALTER TABLE 新增至資料表之新資料行定義的一部分。
Syntax
Syntax for SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL database in Microsoft Fabric
[ 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
}
Arguments
CONSTRAINT
指定開始定義 PRIMARY KEY、UNIQUE、FOREIGN KEY 或 CHECK 條件約束。
constraint_name
這是條件約束的名稱。 條件約束名稱必須遵照識別碼的規則,不過,名稱開頭不能是數字符號 (#)。 如果未提供 constraint_name,就會將系統產生的名稱指派給條件約束。
NULL |NOT NULL
指定資料行是否可以接受 NULL 值。 只有在指定預設值時,才可加入不允許 NULL 值的數據行。 如果新資料列允許 NULL 值且未指定預設值,則資料表中每個資料列的新資料列都會 NULL 包含 。 如果新的數據行允許 NULL 值,且新的數據行已加入預設定義,則WITH VALUES 選項可用來將預設值儲存在資料表中每個現有數據列的新資料行中。
如果新的數據行不允許 NULL 值,則必須使用新的數據行來新增 DEFAULT 定義。 這個新資料行會在現有資料列的各個新資料行中,自動載入預設值。
當加入資料行需要實際變更資料表的資料列時,例如,在每個資料列中加入 DEFAULT 值,執行 ALTER TABLE 會保留資料表的鎖定。 這會影響在鎖定就緒時,變更資料表內容的能力。 相反地,新增允許 NULL 值且未指定預設值的數據行只會是元數據作業,而且不涉及任何鎖定。
當您使用 CREATE TABLE 或 ALTER TABLE時,資料庫和會話設定會影響並可能覆寫數據行定義中使用的數據類型可為 Null 性。 建議您一律明確地將非計算 NULL 數據行定義為 或 NOT NULL ,如果您使用使用者定義的數據類型,則允許數據行使用數據類型的預設 Null 性。 如需詳細資訊,請參閱 CREATE TABLE。
主鍵
這是一個條件約束,它會利用唯一索引來強制執行一個或多個指定之資料行的實體完整性。 每份資料表都只能建立一個 PRIMARY KEY 條件約束。
UNIQUE
這是一個條件約束,它利用唯一索引來提供一個或多個指定之資料行的實體完整性。
CLUSTERED |NONCLUSTERED
指定建立 PRIMARY KEY 或 UNIQUE 條件約束的叢集或非叢集索引。 PRIMARY KEY 條件約束預設為 CLUSTERED。 UNIQUE 條件約束預設為 NONCLUSTERED。
如果叢集條件約束或索引已在資料表中,就無法指定 CLUSTERED。 如果叢集條件約束或索引已在資料表中,PRIMARY KEY 條件約束便預設為 NONCLUSTERED。
屬於 ntext、text、varchar(max) 、nvarchar(max) 、varbinary(max) 、xml 或 image 資料類型的資料行無法指定為索引的資料行。
在Microsoft網狀架構倉儲中,NONCLUSTERED 沒有任何作用。
其中填充因子=填充因子
指定用來儲存索引資料的每個索引頁面,資料庫引擎所應加以填滿的程度。 使用者指定的填滿因數可以是從 1 到 100 的值。 如果未指定值,預設值為 0。
Important
WITH FILLFACTOR記錄為套用至 PRIMARY KEY 或 UNIQUE 條件約束的唯一索引選項,是為了回溯相容性而維持,但未來版本不會以這種方式記載。 您可以在 ALTER TABLE 的 index_option 子句中,指定其他索引選項。
ON { partition_scheme_name(partition_column_name |
適用於:SQL Server 2008 (10.0.x) 和更新版本。
指定條件約束所建立之索引的儲存位置。 如果指定 partition_scheme_name,索引就會進行資料分割,這些資料分割會對應於 partition_scheme_name 所指定的檔案群組。 如果指定了 filegroup,就會在具名檔案群組中建立索引。 如果指定了 "default",或完全未指定 ON,就會在與資料表相同的檔案群組中建立索引。 如果加入 PRIMARY KEY 或 UNIQUE 條件約束的叢集索引時指定了 ON,則建立叢集索引時,會將整份資料表移到指定的檔案群組中。
在這個內容中,default 不是關鍵字。 它是預設檔案群組的識別碼,必須加以分隔,例如 ON default 或 ON [default]。 如果 指定預設值 ,則 QUOTED_IDENTIFIER 目前會話的選項必須為 ON。 這是預設值。 如需詳細資訊,請參閱 SET QUOTED_IDENTIFIER (Transact-SQL)。
未被強制執行
在Microsoft網狀架構倉儲中,主鍵、唯一索引鍵和外鍵條件約束需要NOT ENFORCED。 應用程式必須維護條件約束的完整性。
外鍵參考
這是一個條件約束,它提供資料行中之資料的參考完整性。 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。
無行動
SQL Server 資料庫引擎會產生一則錯誤,且會復原父資料表中資料列的刪除動作。
CASCADE
如果從父資料表中刪除資料列,便會從進行參考的資料表中刪除對應的資料列。
集合空
刪除父資料表中對應資料列時,組成外鍵的所有值都會設定 NULL 為 。 若要執行這個條件約束,外部索引鍵資料行必須可為 Null。
預設
當刪除父資料表中對應的資料列時,所有組成外部索引鍵的值都會設為預設值。 若要執行這個條件約束,所有外部索引鍵資料行都必須有預設定義。 如果數據行可為 Null,而且沒有明確的預設值設定, NULL 就會成為數據行的隱含預設值。
如果資料表要包含在使用邏輯記錄的合併式發行集中,請勿指定 CASCADE。 如需邏輯記錄的詳細資訊,請參閱使用邏輯記錄分組相關資料列的變更。
ON DELETE CASCADE 如果 INSTEAD OF 觸發 ON DELETE 程式已存在於正在改變的數據表上,則無法定義。
例如,在 AdventureWorks2025 資料庫中,ProductVendor 資料表與 Vendor 資料表有參考關聯性。
ProductVendor。
VendorID 外鍵會參考 Vendor。
VendorID 主鍵。
如果在數據表中的數據Vendor列上執行 DELETE 語句,而且已針對 ProductVendorVendorID指定 ON DELETE CASCADE 動作,則 資料庫引擎 會檢查數據表中的ProductVendor一或多個相依數據列。 如果有的話,除了數據表中所參考的數據列之外,也會刪除數據表中的ProductVendor相依Vendor數據列。
相反地,如果指定 NO ACTION,則 資料庫引擎 會引發錯誤,並在數據表中至少有一個參考它的數據列時,回復數據列上的Vendor刪除動作ProductVendor。
ON UPDATE { NO ACTION |CASCADE |SET NULL |SET DEFAULT }
指定當變更的資料表中之資料列有參考關聯性,且在父資料表中所參考的資料列有了更新時,變更的資料表中之資料列會發生什麼動作。 預設值是 NO ACTION。
無行動
資料庫引擎會產生一則錯誤,且會復原父資料表中資料列的更新動作。
CASCADE
當父資料表中的資料列有了更新時,在進行參考的資料表中,也會更新對應的資料列。
集合空
當父資料表中的對應資料列更新時,組成外鍵的所有值都會設定 NULL 為 。 若要執行這個條件約束,外部索引鍵資料行必須可為 Null。
預設
當更新父資料表中對應的資料列時,所有組成外部索引鍵的值都會設為預設值。 若要執行這個條件約束,所有外部索引鍵資料行都必須有預設定義。 如果數據行可為 Null,而且沒有明確的預設值設定, NULL 就會成為數據行的隱含預設值。
如果資料表要包含在使用邏輯記錄的合併式發行集中,請勿指定 CASCADE。 如需邏輯記錄的詳細資訊,請參閱使用邏輯記錄分組相關資料列的變更。
如果在 INSTEAD OF 觸發程序 ON UPDATE 已經存在已警示的資料表,則無法定義ON UPDATE CASCADE、SET NULL、或 SET DEFAULT。
例如,在 AdventureWorks2025 資料庫中,ProductVendor 資料表與 Vendor 資料表有參考關聯性。
ProductVendor。
VendorID 外鍵會參考 Vendor。
VendorID 主鍵。
如果在數據表中的數據Vendor列上執行 UPDATE 語句,且ON UPDATE CASCADE已針對 ProductVendorVendorID指定動作,則 資料庫引擎 會檢查數據表中的ProductVendor一或多個相依數據列。 如果有的話,除了數據表中所ProductVendor參考的數據列之外,數據表中的Vendor相依數據列也會更新。
相反地,如果指定 NO ACTION,則 資料庫引擎 會引發錯誤,並在數據表中至少有一個參考它的數據列時,回復數據列上的Vendor更新動作ProductVendor。
不適用於複寫
適用於:SQL Server 2008 (10.0.x) 和更新版本。
可以指定給 FOREIGN KEY 條件約束和 CHECK 條件約束。 如果條件約束指定了這個子句,當複寫代理程式執行插入、更新或刪除作業時,不會強制執行這個條件約束。
CHECK
這是一個條件約束,藉由限制可能輸入一個或多個資料行的值,強制執行範圍完整性。
logical_expression
CHECK 條件約束所使用的邏輯運算式,會傳回 TRUE 或 FALSE。 搭配 CHECK 條件約束使用的 logical_expression 無法參考其他資料表,但可以參考相同資料列所在之資料表的其他資料行。 這個運算式不能參考別名資料類型。
Remarks
新增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 個叢集索引。 外部索引鍵條件約束不會自動產生索引。 不過,在查詢聯結準則中經常使用外鍵數據行,方法是比對一個數據表的外鍵條件約束與另一個數據表中的主鍵或唯一索引鍵數據行。 外部索引鍵資料行的索引可讓資料庫引擎快速從外部索引鍵資料表中尋找相關資料。
Examples
如需範例,請參閱 ALTER TABLE (Transact-SQL)。