SQL Server Management Studio - 如何添加外键?

47

我总是觉得在管理工具中给主表添加外键很困惑。

假设我有一个

Table1 
{
    ID int, -- Primary Key
    Table2ID int, -- Refers to Table2's ID 
}

Table2 
{
    ID int, -- Primary Key
    SomeData nvarchar(50)
}

我正在通过 右键单击 -> 关系 -> 表和列规范 为 Table1 添加外键。我将“主”弹出窗口设置为 Table2、ID,将“外键表”设置为 Table1,Table2ID。

我的问题:

  1. “外键表”不应该列出 Table2,而“主键”应该列出 Table1 吗?我的理解有误吗?

  2. 当我保存时,会弹出一个警告窗口:“以下表将保存到您的数据库。”并显示两个表。我真的不明白这一点。我只改变了 Table1,为什么还显示第二个表?

5个回答

109
  • 点击表格旁边的展开符号。
  • 右键单击“Keys”文件夹,选择“新建外键”。
  • (或者,当您打开表格时,可以单击工具栏上的“关系”按钮)
  • 单击“Tables and Columns Specifications”行上的“…”按钮以打开编辑器。
  • 下拉菜单左侧是您要添加的表格,静态文本字段将列出您要添加到的表格。
  • 使用下拉菜单指定约束条件,并确保两侧具有相同数量的列。

3
问题是如何在SSMS中执行操作,因此这个答案得到了我的支持。 - Bradley
我理解,如果“新外键”没有出现,那么你可能没有权限或其他问题? - levininja

23

为什么不直接使用相应的T-SQL语句呢?对我来说,这似乎更容易、更清晰:

ALTER TABLE dbo.Table1
  ADD CONSTRAINT FK_Table1_Table2
    FOREIGN KEY(Table2ID) REFERENCES dbo.Table2(ID)

我认为这句话清楚地表明了涉及哪两个表以及它们之间的连接关系(Table1.Table2ID --(参照)--> Table2.ID)。

如果您想在SSMS设计器中操作:您也可以创建一个包含涉及的表的数据库图,然后将来自Table1Table2ID列拖动到Table2上并释放在那里的ID列上- 这会向SSMS以图形方式说明您要做什么,您只需要检查您的选择并单击弹出的对话框上的“确定”即可。


我知道我可以使用T-SQL,但我想了解这个设计背后的原因。此外,拖放操作会弹出相同的窗口... - tvr

9

1. "Foreign Key Table" 应该列出Table1, 而 "Primary Key" 应该列出Table2,我的理解对吗?

我认为你的理解有误。Table2是你正在引用其主键的表,因此在“Primary Key”下列出。Table1是将具有外键(参考另一张表的主键)的表,因此在“Foreign Key Table”下列出。

至于为什么两个表都保存,即使外键后面被列为Table1所属:我认为这是因为外键约束了两个表。它们都必须“知道”约束条件,因此它们都需要被保存。


4

按照以下步骤在您的表中创建外键。

  1. 右键单击列,然后单击关系

enter image description here

  1. ...中单击表和列特定

enter image description here

  1. 选择左侧的主键表和键,并选择要映射到右侧的当前表键。

enter image description here

  1. 点击表和列特定中的向下箭头以确认外键映射。

enter image description here

  1. 单击关闭按钮,现在已创建外键。

1
最佳答案,因为包含了截图。 - Daniel Miradakis

1
ALTER TABLE dbo.Table1
  ADD CONSTRAINT FK_Table1_Table2
    FOREIGN KEY(Table2ID) REFERENCES dbo.Table2(ID)

1
如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮({})以使其格式化和语法高亮! - marc_s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接