适用于: SQL Server 2016 (13.x) 及以后版本
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
本文介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中创建外键关系。 当希望将一个表的行与另一个表的行相关联时,您可在这两个表之间创建关系。
Permissions
创建带有外键的新表需要对该数据库具有 CREATE TABLE 权限,以及对将在其中创建该表的架构具有 ALTER SCHEMA 权限。
在现有表中创建外键需要 ALTER TABLE 对表具有权限。
Limitations
外键约束不一定要链接到另一个表中的主键约束。 外键还可以定义为引用另一个表中
UNIQUE约束的列。如果在
NULL约束的列中输入非FOREIGN KEY值,则此值必须在被引用列中存在。 否则,将返回外键冲突错误消息。 要确保验证了组合外键约束的所有值,请对所有参与列指定NOT NULL。FOREIGN KEY约束仅能引用位于同一服务器上的同一数据库中的表。 跨数据库的引用完整性必须通过触发器实现。 有关详细信息,请参阅CREATE TRIGGER(Transact-SQL)。FOREIGN KEY约束可引用同一表中的其他列,并称之为自引用。在列级指定的
FOREIGN KEY约束只能列出一个引用列。 此列的数据类型必须与定义约束的列的数据类型相同。在表级指定的
FOREIGN KEY约束所具有的引用列数目必须与约束列列表中的列数相同。 每个引用列的数据类型也必须与列表中相应列的数据类型相同。对于表中可包含的引用其他表的
FOREIGN KEY约束数量,数据库引擎没有预定义的限制。 数据库引擎也不限制由引用特定表的其他表所拥有的FOREIGN KEY约束数量。 但是,使用的FOREIGN KEY约束的实际数目受硬件配置以及数据库和应用程序设计的限制。 表最多可以将 253 个其他表和列作为外键引用(传出引用)。 在 SQL Server 2016 (13.x) 及更高版本中,可在单独的表中引用的其他表和列(传入引用)的数量限制已从 253 提高至 1 万。 (要求兼容级别至少为 130。)该增加有以下限制:对于
DELETE和UPDATEDML 操作,支持超过 253 个外键引用。 不支持MERGE操作。具有自引用外键的表仍然最多只能有 253 个外键引用。
超过 253 个外键引用当前不适用于列存储索引或内存优化表。
不会对临时表强制执行
FOREIGN KEY约束。如果在 CLR 用户定义类型的列上定义外键,则该类型的实现必须支持二进制排序。 有关详细信息,请参阅 CLR 用户定义类型。
类型为 varchar(max) 的列仅可参与
FOREIGN KEY约束,前提是它引用的主键也被定义为类型 varchar(max)。
在表设计器中创建外键关系
使用 SQL Server Management Studio
在对象资源管理器中,右键单击该关系中位于外键端的表,然后选择“设计”。
该表在创建和更新数据库表中打开。
在表设计器菜单中,选择关系。 (查看标题中的“表设计器”菜单,或者右键单击表定义的空白区域,然后选择“关系...”。)
在“外键关系”对话框中,选择“添加”。
“选定的关系”列表中将以系统提供的名称显示关系,格式为
FK_<tablename>_<tablename>,其中第一个 tablename 是外键表的名称,第二个 tablename 是主键表的名称。 这只是外键对象的“(名称)”字段的默认和通用命名约定。在选定的关系列表中选择该关系。
选择右侧网格中的 “表和列说明”,然后选择该属性右侧的省略号 (...)。
在“表和列”对话框的“主键”下拉列表中,选择位于关系主键端的表。
在对话框下方的网格中,选择构成该表主键的列。 在每一列右侧相邻的网格单元格中,选择外键表中对应的外键列。
表设计器会为该关系建议一个名称。 若要更改此名称,请编辑 “关系名” 文本框的内容。
选择 “确定” 以创建该关系。
关闭表设计器窗口,并保存更改,使外键关系更改生效。
在新表中创建外键
使用 Transact-SQL
下面的示例创建一个表,并对列 TempID 定义外键约束,以引用 SalesReasonID 数据库中 Sales.SalesReason 表内的列 AdventureWorks。
ON DELETE CASCADE 和 ON UPDATE CASCADE 子句用于确保对 Sales.SalesReason 表的更改自动传播到 Sales.TempSalesReason 表。
CREATE TABLE Sales.TempSalesReason (
TempID INT NOT NULL,
Name NVARCHAR(50),
CONSTRAINT PK_TempSales
PRIMARY KEY NONCLUSTERED (TempID),
CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason(SalesReasonID)
ON DELETE CASCADE
ON UPDATE CASCADE
);
在现有表中创建外键
使用 Transact-SQL
下面的示例对列 TempID 创建外键,并引用 SalesReasonID 数据库中 Sales.SalesReason 表内的列 AdventureWorks。
ALTER TABLE Sales.TempSalesReason
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason (SalesReasonID)
ON DELETE CASCADE
ON UPDATE CASCADE;