从多列主键中包含的一列到另一列的外键

问题描述:

我尝试在一列到两列主键之间创建一个外键,并且SQL Server拒绝了这个键。为什么?从多列主键中包含的一列到另一列的外键

我有一张桌子来储存我的措辞在不同的语言和国家表。

ref.SystemLabels 
    -------------- 
--> [Id] int 
| [IdLanguage] int 
| Label nvarchar(200) 
| Keywords nvarchar(200) 
| 
| ref.Countries 
| -------------- 
| [Id] 
--> IdSystemLabel 
    IsoCode 

在我看来,这是非常逻辑,但我不明白为什么SQL Server不理解或接受我的逻辑^^。

如果有人能帮我解决这个问题。

注意我想另一种方式,我会在IdSystemLabel上创建一个索引,尽管有一个外键。


编辑:至于你问我,请参阅表我的SQL代码

表SystemLanguages

CREATE TABLE [ref].[SystemLanguages](
    [Id] [int] NOT NULL, 
    [IdSystemLabel] [int] NOT NULL, 
    [IsoCode] [nchar](2) NOT NULL, 
    [Enabled] [bit] NOT NULL, 
CONSTRAINT [PK_SystemLanguages] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [ref].[SystemLanguages] ADD CONSTRAINT [DF_SystemLanguages_Enabled] DEFAULT ((0)) FOR [Enabled] 
GO 

表SystemLabels

CREATE TABLE [ref].[SystemLabels](
    [Id] [int] NOT NULL, 
    [IdLanguage] [int] NOT NULL, 
    [Label] [nvarchar](max) NOT NULL, 
    [Keywords] [nvarchar](200) NULL, 
    [CreatedAt] [datetime] NOT NULL, 
    [UpdatedAt] [datetime] NULL, 
    [Group] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_SystemLabels] PRIMARY KEY CLUSTERED 
(
    [Id] ASC, 
    [IdLanguage] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

ALTER TABLE [ref].[SystemLabels] ADD CONSTRAINT [DF_SystemLabels_CreatedAt] DEFAULT (getdate()) FOR [CreatedAt] 
GO 

注:该表不能有外键SystemLanguages由于循环依赖

表LocalizationLevel0

CREATE TABLE [ref].[LocalizationLevel0](
    [Id] [int] NOT NULL, 
    [IdSystemLabel] [int] NOT NULL, 
    [IsoCode] [nchar](2) NOT NULL, 
    [CreatedAt] [datetime] NOT NULL, 
    [UpdatedAt] [datetime] NULL, 
    [Enabled] [bit] NULL, 
CONSTRAINT [PK_LocalizationLevel0] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [ref].[LocalizationLevel0] ADD CONSTRAINT [DF_LocalizationLevel0_CreatedAt] DEFAULT (getdate()) FOR [CreatedAt] 
GO 

ALTER TABLE [ref].[LocalizationLevel0] ADD CONSTRAINT [DF_LocalizationLevel0_Enabled] DEFAULT ((0)) FOR [Enabled] 
GO 

我想解释一下我的逻辑:

一个localizationlevel0项目可以有多种系统语言的翻译:

示例fo [R法国国家

1 4 'FR' '2015-04-17 00:00:00:000' NULL 1 

- 系统语言

1 1 'FR' 1 
2 2 'EN' 1 
3 3 'DE' 1 

- 通讯字眼

1 1 'Français' NULL '2015-04-17 00:00:00:000' NULL 'SystemLanguages' 
1 2 'French' NULL '2015-04-17 00:00:00:000' NULL 'SystemLanguages' 
1 2 'Französisch' NULL '2015-04-17 00:00:00:000' NULL 'SystemLanguages' 

... 
4 1 'France' NULL '2015-04-17 00:00:00:000' NULL 'LocalizationLevel0' 
4 2 'France' NULL '2015-04-17 00:00:00:000' NULL 'LocalizationLevel0' 
4 3 'Frankreich' NULL '2015-04-17 00:00:00:000' NULL 'LocalizationLevel0' 
+0

你到底想达到什么目的?外键和索引是两个不同的东西... – jarlh

+0

这可能意味着有一列到两列外键可能是什么意思?这将施加什么样的参考约束。 –

+3

也发布你的SQL。 –

+1

好,所以我的第二个想法似乎很好。我必须在Id列上创建一个唯一的索引。感谢您的回答 ;-)。 – D4rkTiger

你必须始终引用整个主键。
因此,如果第一个表具有复合主键(Id, IdLanguage),则第二个表必须也具有复合外键(SystemLabels.Id, SystemLabels.Language)而不是只是(SystemLabels.Id)