2009-12-16 103 views
1

我想创建一个由int列和datetime列组成的外键约束(两者都不为空)。SQL Server外键问题

我收到错误 “引用表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) 

理解任何想法。

谢谢

+0

是否有可能向我们展示您的表格架构? – Graviton 2009-12-16 11:11:13

+0

我想知道是否因为表X的索引在分区方案上,而表Y不是? – Chris 2009-12-16 12:23:24

回答

0

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

0

我已经在SQL2005 Dev版本中测试过了,在PRIMARY文件组中创建了表X和Y.我没有麻烦(因为我怀疑我不会)创建你描述的外键。我也怀疑(但我不太确定)是否将表分区到多个文件组中,这样会影响到这一点。

您能否提供您用于创建表格的SQL?这可能会揭示出问题的原因,特别是如果有一些奇怪的设置处于活动状态(并且SQL Server充满了奇怪的设置)。

0

显然问题出在内部列的排序按键。 由于表X的主键是(CreatedAt,LineId), 改变脚本:

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

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