本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中创建外键关系。 当希望将一个表的行与另一个表的行相关联时,您可在这两个表之间创建关系。
本主题内容
准备工作:
若要创建外键关系,请使用下列步骤:
在您开始之前
局限性与限制
外键约束不必仅链接到另一个表中的主键约束;还可以定义它以引用另一个表中 UNIQUE 约束的列。
如果在 FOREIGN KEY 约束的列中输入非 NULL 值,则此值必须在被引用列中存在;否则,将返回违反外键约束的错误信息。 为了确保复合外键约束的所有值都得到验证,请在所有参与的列上指定 NOT NULL。
FOREIGN KEY 约束仅能引用位于同一服务器上的同一数据库中的表。 跨数据库的引用完整性必须通过触发器实现。 有关详细信息,请参阅 CREATE TRIGGER (Transact-SQL)。
FOREIGN KEY 约束可引用同一表中的其他列。 此行为称为自引用。
在列级别指定的 FOREIGN KEY 约束只能列出一个引用列。 此列的数据类型必须与定义约束的列的数据类型相同。
在表级别指定的 FOREIGN KEY 约束必须具有与约束列列表中的列数相同的引用列数。 每个引用列的数据类型也必须与列表中相应列的数据类型相同。
数据库引擎对表可以包含的引用其他表的 FOREIGN KEY 约束数或引用特定表的其他表拥有的 FOREIGN KEY 约束数没有预定义的限制。 尽管如此,可使用的 FOREIGN KEY 约束的实际数目还是受硬件配置以及数据库和应用程序设计的限制。 建议表中包含的 FOREIGN KEY 约束不要超过 253 个,并且引用该表的 FOREIGN KEY 约束也不要超过 253 个。
对临时表不强制实施外键约束。
如果在 CLR 用户定义类型的列上定义外键,则该类型的实现必须支持二进制排序。 有关详细信息,请参阅 CLR 用户定义类型。
某列的类型为
varchar(max)时,只有在它所引用的主键也定义为类型varchar(max)时,才能参与 FOREIGN KEY 约束。
安全
权限
使用外键创建新表需要数据库中的 CREATE TABLE 权限,并且需要对要在其中创建表的架构具有 ALTER 权限。
在现有表中创建外键需要对表具有 ALTER 权限。
使用 SQL Server Management Studio
在表设计器中创建外键约束关系
在对象资源管理器中,右键单击处于该关系外键一侧的表,然后单击“设计”。
表将在 表设计器中打开。
在 “表设计器 ”菜单中,单击“ 关系”。
在 “外键关系 ”对话框中,单击“ 添加”。
关系显示在“所选关系”列表中,系统提供的名称格式为FK_<tablename>_<tablename>,其中tablename是外键表的名称。
单击 “所选关系 ”列表中的关系。
单击右侧网格中的 表和列规范 ,然后单击属性右侧的省略号(...)。
在表和列对话框中的主键下拉列表中,选择作为关系主键端的表。
在下面的网格中,选择构成表主键的列。 在每个列左侧的相邻网格单元中,选择外键表中对应的外键列。
表设计器 将为此关系提供一个建议名称。 若要更改此名称,请编辑 “关系名” 文本框的内容。
选择 “确定” 来创建关系。
使用 Transact-SQL
在新表中去创建外键
在 “对象资源管理器” 中,连接到某个数据库引擎实例。
在标准栏上,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。 该示例创建一个表,并在列
TempID上定义一个外键约束,该约束引用Sales.SalesReason表中的列SalesReasonID。 ON DELETE CASCADE 和 ON UPDATE CASCADE 子句用于确保对Sales.SalesReason表所做的更改自动传播到Sales.TempSalesReason表。USE AdventureWorks2012; GO 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 );GO
在现有表中创建外键
在 “对象资源管理器” 中,连接到某个数据库引擎实例。
在标准栏上,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。 该示例在列
TempID上创建外键并引用表中的Sales.SalesReason列SalesReasonID。USE AdventureWorks2012; GO ALTER TABLE Sales.TempSalesReason ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID) REFERENCES Sales.SalesReason (SalesReasonID) ON DELETE CASCADE ON UPDATE CASCADE ; GO有关详细信息,请参阅 ALTER TABLE(Transact-SQL)、CREATE TABLE(Transact-SQL)和table_constraint(Transact-SQL)。