0

我有两个表,Table_1 4列(3主键)和Table_2 2列。当我尝试创建Table_2一个外键约束,我收到此错误:SQL Server - 外键参考错误

enter image description here

这里是我的表的定义:

TABLE_1

CREATE TABLE [dbo].[Table_1] 
(
    [Field_1] [tinyint] NOT NULL, 
    [Field_2] [tinyint] NOT NULL, 
    [Field_3] [tinyint] NOT NULL, 
    [Field_4] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
(
    [Field_1] ASC, 
    [Field_2] ASC, 
    [Field_3] ASC 
) 

表2

CREATE TABLE [dbo].[Table_2] 
(
    [Field_1] [tinyint] NOT NULL, 
    [Field_2] [tinyint] NOT NULL 
) ON [PRIMARY] 

你对如何解决这个问题有任何想法吗?谢谢 -

+4

'Field_1'不是主键。您应该通过视觉主题将其设置为主键,或将'Table_1'的脚本更改为'[Field_1] [tinyint] PRIMARY KEY', – 2012-04-27 10:24:49

+0

Hi Lieven,对不起,我忘记在我的示例中添加主键表。无论如何,我已经更新了我的表格,现在已经定义了主键。但是我仍然遇到同样的错误。 – neztreh 2012-04-27 10:35:16

+1

要使SQL Server能够创建外键,必须确保只有一个**记录可以返回给定的外键。由于您在多个字段上有主键,因此不能保证“Field_1”是唯一的。如果您无法更改主键,则只需在'Table_1.Field_1'上添加一个唯一索引即可。如果唯一索引也不可用,则不能创建外键。 – 2012-04-27 10:41:35

回答

2

Table_1主键是Field_1Field_2Field_3的所有三个。为了引用另一个表中的密钥,您必须引用该密钥中所有列的 - 因此您需要将Field_2Field_3添加到Table_2,并且在尝试创建外键时包含所有三列约束。

替代地,如果Field_1,其本身是一个Table_1键,然后通过重新定义主键,或对刚才Field_1Table_1添加UNIQUE约束声明它是这样,无论是。然后你就可以创建你正在尝试的外键。

+0

添加一个UNIQUE约束解决了这个问题。谢谢Damien! – neztreh 2012-04-27 13:11:05