首页 文章

SQL Server外键问题

提问于
浏览
1

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

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

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

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

Table X:

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

Table 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

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

  • 0

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

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

  • 0

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

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

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

相关问题