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

在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))

然后,我创建了一个称为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))

但是我无法创建BookCopy关系,因为出现了上述错误。

我真的很感谢一些有用的帮助。

user2622438 asked 2020-08-12T08:49:10Z
4个解决方案
56 votes

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

目前,您唯一的唯一索引是REFERENCES上的复合索引,这是您的主键。

根据BookTitle所保存的内容以及其中的数据关系,有许多选项可供您选择。

我会猜测,书号的每一行ISBN都是唯一的。 基于这种情况,然后将主键更改为仅在ISBN上,并更改BookCopy,以便您拥有ISBN并加入ISBN,而不是Title。

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

更一般而言,您需要确保REFERENCES子句中具有的一个或多个列与父表中的唯一索引完全匹配:在您的情况下,它会失败,因为您仅在Title上没有单个唯一索引。

Chris J answered 2020-08-12T08:49:38Z
13 votes

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

如果这不起作用:

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

然后这可能有效(不适用于此特定示例,但通常而言):

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

Dan answered 2020-08-12T08:50:16Z
6 votes

你需要

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

外键需要唯一地标识父行:由于Title不是唯一的,您目前无法做到这一点。

gbn answered 2020-08-12T08:50:49Z
3 votes

BookTitle具有组合键。 因此,如果将BookTitle的密钥引用为foreign key,则必须携带完整的复合密钥。

因此,要解决此问题,您需要在3007895871831834031104中添加完整的组合键。因此,也要添加3007895871834034031105列。 最后他们。

foreign key (ISBN, Title) references BookTitle (ISBN, Title)
Talha Ahmed Khan answered 2020-08-12T08:51:14Z
translate from https://stackoverflow.com:/questions/17879735/there-are-no-primary-or-candidate-keys-in-the-referenced-table-that-match-the-re