SQL Server 2005中复合主键的外键关系

63

我有两个表

Table1(
  FileID,
  BundledFileID,
  Domain)
并且
Table2(
  FileID,
  FileType,
  FileName)

在Table2中,FileIDFileType是复合主键。我想从Table1.FileID创建一个指向Table2的外键关系。

这种操作是否可行?


复合键是外键。也就是说,您需要包括复合键中的所有列,以使与table2的关系正常工作。 - Arthur Zennig
3个回答

104

由于Table2具有复合主键(FileID,FileType),因此对其的任何引用都必须包括这两个列

ALTER TABLE dbo.Table1
  ADD CONSTRAINT FK_Table1_Table2
  FOREIGN KEY(FileID, FileType) REFERENCES Table2(FileID, FileType)

除非您在Table2.FileID字段上有唯一约束/索引(但如果有,为什么不是主键?),否则无法创建到目标表主键的部分的FK关系-这只是无法做到。


1
这是标准的 SQL 还是仅适用于 MS SQL Server? - Jus12
2
@Jus12:那是标准的SQL。 - marc_s
但是Table1没有“FileType”列,您的意思是他应该为了创建约束而向Table1添加一列吗? - BornToCode
3
如果他想通过外键引用该复合主键,那么他必须将FileType列添加到Table1中,以便创建FK关系。 - marc_s
我明白。这难道不意味着通过创建一个单独的表,其中FileID是主键,可以更好地设计表格吗? - BornToCode
1
@BornToCode:问题实际上是是否有必要在Table1的主键中拥有两个列。如果FileID确实是一个ID(唯一的,可能是IDENTITY(1,1)),那么通常不需要添加第二个列到你的主键中... - marc_s

4

马克已经给出了一个相当不错的答案。如果Table1中的行仅与一种类型的文件(例如FileType 'ABC')相关,则可以将FileType添加为Table1的计算列:

ALTER TABLE Table1 ADD FileType as 'ABC'

然后你可以在外键中使用它。


0

我是使用SQL Server Management Studio完成的:

首先引用外键,然后创建组合主键。

在创建Table2时,一开始不要创建主键。 首先创建Table2.FileID与Table1.FileID的外键。然后为Table2设置组合键(Table2.FileID,Table2.FileType)。

如果FileType也需要成为外键,则遵循相同的概念。首先引用这两个外键,然后创建组合键。


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