SQL Server Management Studio 不允许我为多个主键创建多个外键
SQL Server Management Studio does NOT let me create multiple foreign keys to multiple primary keys
我有一个 table ApplicationRegion
与 Translation
的一对多关系。
我想将 FK 从 Translation.appname/isocode
设置为 ApplicationRegion.appname/isocode
但是正如您从屏幕截图中看到的那样,这并没有奏效。
当 FK 配置 window 打开时,left/right 侧显示 3 列
appname
isocode
resourcekey
然后我选择作为父 table ApplicationRegion
并从 FK 设置中删除资源键列。
然后单击“确定”,但我收到了您在屏幕截图中看到的错误。
我终于让它与那个解决方法一起工作,我想知道为什么我必须使用这个解决方法?
- 从 Translation.ResourceKey 列删除 PK
- 打开FK配置window
- 现在只有 2 列显示为外键
- 我点击确定
- 现在我再次将 PK 添加到 Translation.ResouceKey 列
- 我向所有 3 个 table 添加了测试数据,一切正常。
为什么采用此解决方法?
更新
哈哈...
我认为您一定在 SSMS 中遇到了一个奇怪的故障。我能够使用 SSMS 2014 创建您的架构,没有任何错误。添加新外键时,它确实预填充了三个复合主键列。在我开始在 FK 中添加两列之前,我很小心地确保它们都被清空了。也许 SSMS 认为其中一个空白行中仍有数据。
编辑:再想一想,SSMS 以缓存编辑 table 时所做的任何更改而闻名。例如,如果您要修改两个 table 并打开两个编辑 windows。然后你在一个 window 中更改 PK,然后尝试在第二个 window 中引用它,它会出错,因为它缓存了第一个 table 的模式,当 window 首次打开。
这是我生成的 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])
我有一个 table ApplicationRegion
与 Translation
的一对多关系。
我想将 FK 从 Translation.appname/isocode
设置为 ApplicationRegion.appname/isocode
但是正如您从屏幕截图中看到的那样,这并没有奏效。
当 FK 配置 window 打开时,left/right 侧显示 3 列
appname
isocode
resourcekey
然后我选择作为父 table ApplicationRegion
并从 FK 设置中删除资源键列。
然后单击“确定”,但我收到了您在屏幕截图中看到的错误。
我终于让它与那个解决方法一起工作,我想知道为什么我必须使用这个解决方法?
- 从 Translation.ResourceKey 列删除 PK
- 打开FK配置window
- 现在只有 2 列显示为外键
- 我点击确定
- 现在我再次将 PK 添加到 Translation.ResouceKey 列
- 我向所有 3 个 table 添加了测试数据,一切正常。
为什么采用此解决方法?
更新
哈哈...
我认为您一定在 SSMS 中遇到了一个奇怪的故障。我能够使用 SSMS 2014 创建您的架构,没有任何错误。添加新外键时,它确实预填充了三个复合主键列。在我开始在 FK 中添加两列之前,我很小心地确保它们都被清空了。也许 SSMS 认为其中一个空白行中仍有数据。
编辑:再想一想,SSMS 以缓存编辑 table 时所做的任何更改而闻名。例如,如果您要修改两个 table 并打开两个编辑 windows。然后你在一个 window 中更改 PK,然后尝试在第二个 window 中引用它,它会出错,因为它缓存了第一个 table 的模式,当 window 首次打开。
这是我生成的 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])