SQL Server外键问题

时间:2009-12-16 11:09:18

标签: sql-server foreign-keys

我正在尝试创建一个由int列和datetime列组成的外键约束(两者都不为null)。

我收到错误 “引用的表X中没有与外键FK中的引用列列表匹配的主键或候选键。”

通常,此错误表示目标表中的列不是唯一的。 然而,它是主键,所以它绝对是独一无二的。

外键引用的表在多个文件组之间进行分区 - 而创建外键的表位于主文件组中。这可能是问题吗? 日期是否可以成为外键的一部分?

表X:

LineId (int not null) (PK)
CreatedAt (datetime not null) (PK)
Message (nvarchar(max))
userId (int not null)

表Y:

LineId (int not null) (PK) (FK)
SId (int not null) (PK)
LineCreatedAt (datetime not null) (FK)
CreatedAt (datetime not null)

SQL命令:

ALTER TABLE Y
ADD CONSTRAINT [FK1] 
FOREIGN KEY(LineId,LineCreatedAt)
REFERENCES X(LineId, CreatedAt)

任何想法都赞赏。

由于

3 个答案:

答案 0 :(得分:0)

不,您收到的错误并不意味着列不是唯一的。 这意味着您引用的列与外表中的列不匹配。 你能显示2个表和你的FK定义吗?

答案 1 :(得分:0)

我在SQL2005 Dev版本中对此进行了测试,在PRIMARY文件组中创建了表X和Y.在创建你描述的外键时,我没有遇到任何麻烦(我怀疑我不会这样做)。我也怀疑(但我不太确定)将表分区在多个文件组上会以这种方式影响它。

您能提供用于创建表的SQL吗?这可能会解释您的问题的原因,特别是如果有一些奇怪的设置是活动的(并且SQL-Server充满了奇怪的设置。)

答案 2 :(得分:0)

显然问题在于键内列的排序。 由于表X的主键是(CreatedAt,LineId), 将脚本更改为:

ALTER TABLE Y
ADD CONSTRAINT [FK1] 
FOREIGN KEY(LineCreatedAt,LineId)
REFERENCES X(CreatedAt,LineId)

成功运作。 这是一个错误的错误,但在查看对象资源管理器时,您只能看到键列,而不是键中的顺序。