SQL Server Management Studio不允许我为多个主键创建多个外键

时间:2015-09-23 19:59:47

标签: sql-server ssms sql-server-2014

我与ApplicationRegion的一对多关系中有一个表Translation

我想将FK从Translation.appname/isocode设置为ApplicationRegion.appname/isocode

但是从屏幕截图中可以看出这没有用。

当FK配置窗口打开时,左/右侧显示3列

appname
isocode
resourcekey

然后我选择了父表ApplicationRegion并从FK设置中删除了资源键列。

然后点击“确定”,然后我收到了您在屏幕截图中看到的错误。

enter image description here

最后我使用了这个解决方法,我想知道为什么我必须使用这个解决方法?

  1. 从Translation.ResourceKey列中删除PK
  2. 打开FK配置窗口
  3. 现在只有2列显示为外键
  4. 我点击OK
  5. 现在我再次将PK添加到Translation.ResouceKey列
  6. 我在所有3个表中添加了测试数据,一切都很好。
  7. 为什么要解决此问题?

    更新

    ... HAHA

    enter image description here

1 个答案:

答案 0 :(得分:0)

我认为你必须在SSMS中遇到一个奇怪的故障。我能够使用SSMS 2014创建您的架构,没有任何错误。在添加新FK时,它确实预先填充了三个复合主键列。在我开始在FK中添加两列之前,我小心翼翼地确保它们都被清空了。也许SSMS认为其中一个空白行仍然有数据。

编辑:还有一个想法,SSMS知道用于缓存编辑表时所做的任何更改。例如,如果您要修改两个表并打开两个编辑窗口。然后你在一个窗口中更改PK,然后尝试在第二个窗口中引用它,它会出错,因为它已经缓存了第一次打开窗口时第一个表的模式。

这是我生成的DDL:

CREATE TABLE [dbo].[AppRegion](
    [appname] [nvarchar](50) NOT NULL,
    [isocode] [char](5) NOT NULL,
 CONSTRAINT [PK_AppRegion] PRIMARY KEY CLUSTERED 
(
    [appname] ASC,
    [isocode] ASC
)
) ON [PRIMARY]

CREATE TABLE [dbo].[Translation](
    [ResourceKey] [nvarchar](128) NOT NULL,
    [appname] [nvarchar](50) NOT NULL,
    [isocode] [char](5) NOT NULL,
    [text] [nvarchar](400) NULL,
 CONSTRAINT [PK_Translation] PRIMARY KEY CLUSTERED 
(
    [ResourceKey] ASC,
    [appname] ASC,
    [isocode] ASC
)
) ON [PRIMARY]

ALTER TABLE [dbo].[Translation]   ADD  CONSTRAINT [FK_Translation_AppRegion] FOREIGN KEY([appname], [isocode])
REFERENCES [dbo].[AppRegion] ([appname], [isocode])