引用表中没有与外键中的引用列列表匹配的主键或候选键

use*_*438 43 sql sql-server candidate key

在SQL Server中,我收到此错误 - >

"引用的表'BookTitle'中没有主键或候选键与外键'FK_ BookCopy _Title__2F10007B' 中的引用列列表匹配."

我首先创建了一个称为BookTitle关系的关系.

CREATE TABLE BookTitle (
ISBN            CHAR(17)       NOT NULL,
Title           VARCHAR(100)   NOT NULL,
Author_Name     VARCHAR(30)    NOT NULL,
Publisher       VARCHAR(30)    NOT NULL,
Genre           VARCHAR(20)    NOT NULL,
Language        CHAR(3)        NOT NULL,    
PRIMARY KEY (ISBN, Title))
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个称为BookCopy关系的关系.这种关系需要引用BookTitle关系的主键,Title.

CREATE TABLE BookCopy (
CopyNumber         CHAR(10)            NOT NULL,
Title              VARCHAR(100)        NOT NULL,
Date_Purchased     DATE                NOT NULL,
Amount             DECIMAL(5, 2)       NOT NULL,
PRIMARY KEY (CopyNumber),
FOREIGN KEY (Title) REFERENCES BookTitle(Title))
Run Code Online (Sandbox Code Playgroud)

但我无法创建BookCopy关系,因为上面提到的错误出现了.

我非常感谢一些有用的帮助.

Chr*_*s J 57

外键通过将列连接到另一个表中的唯一键来工作,并且该唯一键必须定义为某种形式的唯一索引,无论是主键还是其他一些唯一索引.

目前,您拥有的唯一唯一索引ISBN, Title是您的主键上的复合索引.

您可以使用多种选项,具体取决于BookTitle的确切内容以及其中的数据关系.

我猜测,对于BookTitle中的每一行,ISBN都是唯一的.假设是这种情况,然后将主键更改为仅在ISBN上,并更改BookCopy,以便您拥有ISBN而不是标题,并加入其中.

如果您需要保留主键,ISBN, Title则需要将ISBN存储在BookCopy以及标题和两列上的外键中,或者您需要在BookTitle(标题)上创建唯一索引作为不同的索引.

更一般地说,您需要确保REFERENCES子句中的一列或多列完全匹配父表中的唯一索引:在您的情况下,它会失败,因为您没有单独的唯一索引Title.

  • 不,这是因为外键在概念上总是映射到父表中的一行。这是由对表的唯一约束(在许多RDBMS上实现为索引)来强制执行的。但这不是必须的。 (3认同)

小智 13

另一件事是 - 如果您的密钥非常复杂,有时您需要替换字段的位置,这有助于:

如果这个剂量有效:

外键(ISBN,标题)引用BookTitle(ISBN,Title)

那么这可能会起作用(不是针对这个具体的例子,而是一般):

外键(标题,ISBN)参考BookTitle(标题,ISBN)

  • 谢谢!我终于克服了那个愚蠢的错误.[索引中列的顺序有多重要?](/sf/ask/160486371/)解释了订单的重要性. (4认同)

gbn*_*gbn 6

你需要

  • BookTitle中Title的唯一索引
  • BookCopy中的ISBN列和FK都在两列上

外键需要唯一标识父行:您目前无法这样做,因为Title不是唯一的.


Tal*_*han 5

BookTitle有一个复合键。因此,如果将 of 的键BookTitle引用为 a foreign key,则必须携带完整的复合键。

所以要解决这个问题,你需要在BookCopy. 所以也添加ISBN列。他们在最后。

foreign key (ISBN, Title) references BookTitle (ISBN, Title)
Run Code Online (Sandbox Code Playgroud)