使用
Syntax
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
(column [ ASC | DESC ] [ ,...n ] )
[ WITH FILLFACTOR = fillfactor
[ WITH ( <index_option>[ , ...n ] ) ]
[ ON { partition_scheme_name ( partition_column_name ... )
| filegroup | "default" } ]
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CONNECTION
( { node_table TO node_table }
[ , {node_table TO node_table }]
[ , ...n ]
)
[ ON DELETE { NO ACTION | CASCADE } ]
| DEFAULT constant_expression FOR column [ WITH VALUES ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
Arguments
CONSTRAINT
指定 、、FOREIGN KEY或约束或CHECK约束DEFAULT的定义PRIMARY KEYUNIQUE开始。
约束名称
约束的名称。 约束名称必须遵循 标识符规则,但名称不能以数字符号开头(#)。 如果未提供 constraint_name,系统将生成的名称分配给约束。
主键
使用唯一索引强制执行指定列或列的实体完整性的约束。 只能为每个表创建一个 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 或 图像 数据类型的列指定为索引的列。
column
在新的约束中使用的括号中指定的列或列列表。
[ ASC |DESC ]
指定加入到表约束中的一列或多列的排序顺序。 默认值为升序排序顺序(ASC)。
WITH FILLFACTOR = fillfactor
指定数据库引擎应如何使每个索引页用于存储索引数据。 用户指定的 fillfactor 值的范围可以为 1 到 100。 如果未指定值,则默认值为 0。
为了向后兼容,本文档包含WITH FILLFACTOR = <fillfactor>唯一适用于或UNIQUE约束的PRIMARY KEY索引选项。 将来的版本不会记录此语法。 可以在 . 的 ALTER TABLEindex_option 子句中指定其他索引选项。
ON { partition_scheme_name(partition_column_name) | filegroup|“default” }
应用到:SQL Server 2008(10.0.x)及更高版本。
指定为约束创建的索引的存储位置。 如果指定 partition_scheme_name,则会对索引进行分区,并将分区映射到 partition_scheme_name 指定的文件组。 如果指定 文件组,则会在命名文件组中创建索引。 如果指定 “default” 或根本不指定 ON 索引,则会在表所在的同一文件组中创建索引。 如果在为某个或UNIQUE约束添加聚集索引PRIMARY KEY时指定ON,则创建聚集索引时,整个表将移动到指定的文件组。
在此上下文中,默认值不是关键字;它是默认文件组的标识符,必须按“default”或 ON[default] 中的ON分隔符。 如果指定 “default”,则 QUOTED_IDENTIFIER 选项必须为 ON 当前会话。 这是默认设置。
外键引用
为列中的数据提供引用完整性的约束。
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 则成为该列的隐式默认值。
不要指定 CASCADE 表是否包含在使用逻辑记录的合并发布中。 有关逻辑记录的详细信息,请参阅通过逻辑记录对相关行的更改进行分组。
无法定义 ON DELETE CASCADE 要 INSTEAD OF 更改的表上是否已存在触发器 ON DELETE 。
例如,在 AdventureWorks2025 数据库中,ProductVendor 表与 Vendor 表有引用关系。
ProductVendor.VendorID 外键引用 Vendor.VendorID 主键。
如果在 Vendor 表中的某一行上执行 DELETE 语句,并为 ProductVendor.VendorID 指定 ON DELETE CASCADE 操作,则数据库引擎检查 ProductVendor 表中的一个或多个依赖行。 如果存在,除了表中引用的行外,还会删除表中的Vendor依赖行ProductVendor。
相反,如果指定 NO ACTION,数据库引擎将引发错误,并在引用它的 ProductVendor 表中至少有一行时回滚对 Vendor 行的删除操作。
ON UPDATE { NO ACTION |CASCADE |SET NULL |SET DEFAULT }
指定当这些行具有引用关系并且更新父表中引用的行时,对表中的行执行的操作。 默认值为 NO ACTION。
无行动
数据库引擎引发错误,父表中行的更新操作将回滚。
CASCADE
如果在父表中更新了一行,则将在引用表中更新相应的行。
空集合
设置在更新父表中相应行时构成外键 NULL 的所有值。 若要执行此约束,外键列必须可为空值。
设置默认值
如果更新了父表中的相应行,则会将构成外键的所有值都设置为其默认值。 若要执行此约束,所有外键列都必须有默认定义。 如果列可为 null,并且没有显式默认值集, NULL 则将成为列的隐式默认值。
不要指定 CASCADE 表是否包含在使用逻辑记录的合并发布中。 有关逻辑记录的详细信息,请参阅通过逻辑记录对相关行的更改进行分组。
ON UPDATE CASCADE,SET NULL或者,如果INSTEAD OF正在更改的表上已存在触发器ON UPDATE,则SET DEFAULT无法定义。
例如,在 AdventureWorks2025 数据库中,ProductVendor 表与 Vendor 表有引用关系。
ProductVendor.VendorID 外键引用 Vendor.VendorID 主键。
如果在 Vendor 表中的行上执行 UPDATE 语句,并为 ProductVendor.VendorID 指定 ON UPDATE CASCADE 操作,则数据库引擎检查 ProductVendor 表中的一个或多个依赖行。 如果存在,则 ProductVendor 更新表中的依赖行,以及表中引用的 Vendor 行。
相反,如果指定 NO ACTION,数据库引擎将引发错误,并在引用它的 ProductVendor 表中至少有一行时回滚对 Vendor 行的更新操作。
不是为了复制
应用到:SQL Server 2008(10.0.x)及更高版本。
如果为约束指定此子句,则复制代理在执行写入操作时不会强制实施约束。 可以为约束和CHECK约束指定此子句FOREIGN KEY。
CONNECTION
指定允许给定边缘约束连接的节点表对。
ON DELETE 指定删除边缘连接节点时边缘表中的行会发生什么情况。
DEFAULT
指定列的默认值。 使用 DEFAULT 定义为现有数据行中的新列提供值。 不能将定义添加到 DEFAULT 具有 时间戳 数据类型、 IDENTITY 属性、现有 DEFAULT 定义或绑定默认值的列。 如果列具有现有默认值,则必须删除默认值,然后才能添加新默认值。 如果为用户定义的类型列指定默认值,该类型应支持从 constant_expression 隐式转换为用户定义的类型。 若要保持与早期版本的SQL Server的兼容性,可以将约束名称分配给 DEFAULT。
constant_expression
用作默认列值的文字值、或 NULL系统函数。 如果将
FOR 列
指定与表级 DEFAULT 定义关联的列。
含值
添加列和
DEFAULT约束时,如果列允许 null,则使用WITH VALUES将现有行的新列值设置为constant_expression中DEFAULT给定的值。如果要添加的列不允许 null 值,则现有行的列值始终设置为常量表达式中
DEFAULT给定的值。
在 SQL Server 2012 及更高版本中,此操作可以是元数据操作adding-not-null-columns-as-an-online-operation。
如果在未添加相关列时使用 WITH VALUES ,则它不起作用。
CHECK
一个约束,该约束通过限制可输入一列或多列中的可能值来强制实现域完整性。
logical_expression
在返回TRUE或 FALSE. 的约束中使用的CHECK逻辑表达式。 与约束一起使用CHECK的logical_expression不能引用另一个表,但可以引用同一行的同一表中的其他列。 表达式无法引用别名数据类型。
Remarks
添加 FOREIGN KEY 或 CHECK 约束时,系统会检查所有现有数据是否存在约束冲突,除非指定了 WITH NOCHECK 该选项。 如果发生任何冲突, ALTER TABLE 则失败并返回错误。 向现有列添加新 PRIMARY KEY 或 UNIQUE 约束时,列或列中的数据必须是唯一的。 如果找到重复值, ALTER TABLE 则失败。 添加或UNIQUE约束时PRIMARY KEY,此选项WITH NOCHECK不起作用。
每个 PRIMARY KEY 约束都会 UNIQUE 生成一个索引。
UNIQUE
PRIMARY KEY和约束数不能导致表上的索引数超过 999 个非聚集索引和 1 个聚集索引。 外键约束不会自动生成索引。 但是,通过将一个表的外键约束中的列或列与另一个表中的主键或唯一键列或列匹配,经常在查询中使用外键列的联接条件。 使用外键列的索引,数据库引擎可以快速查找外键表中的相关数据。
在 SQL Server 2022(16.x)及更高版本中,可恢复的操作支持为主键和唯一键约束添加表约束。 有关启用和使用可恢复 ALTER TABLE ADD CONSTRAINT 操作的详细信息,请参阅可恢复添加表约束。
Microsoft Fabric中的仓库支持 ADD 或 DROPPRIMARY KEY、UNIQUE 和 FOREIGN_KEY 列约束,但前提是指定了 NOT ENFORCED 选项。 Microsoft Fabric中的仓库会阻止所有其他 ALTER TABLE 操作。
Examples
有关示例,请参阅 ALTER TABLE (Transact-SQL)。