【问题标题】:SQL Server Foreign Key ProblemSQL Server 外键问题
【发布时间】:2009-12-16 11:09:17
【问题描述】:

我正在尝试创建一个由 int 列和 datetime 列(均非空)组成的外键约束。

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

任何想法表示赞赏。

谢谢

【问题讨论】:

  • 可以向我们展示您的表架构吗?
  • 我想知道是不是因为表 X 的索引在分区方案上,而表 Y 不是?

标签: sql-server foreign-keys


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多