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

Sql 被引用表中没有与外键中的引用列列表匹配的主键或候选键,sql,sql-server,key,candidate,Sql,Sql Server,Key,Candidate,在SQL Server中,我遇到了以下错误-> “引用的表中没有主键或候选键 与外键中的引用列列表匹配的“BookTitle” “FK_书籍副本_标题__2F10007B.” 我首先创建了一个名为BookTitle关系的关系 CREATE TABLE BookTitle ( ISBN CHAR(17) NOT NULL, Title VARCHAR(100) NOT NULL, Author_Name VARCHAR(30)

在SQL Server中,我遇到了以下错误->

“引用的表中没有主键或候选键 与外键中的引用列列表匹配的“BookTitle” “FK_书籍副本_标题__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
关系的关系。此关系需要引用
书籍标题
关系的主键
标题

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
关系,因为出现了上述错误


我真的很感激一些有用的帮助

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

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

根据书名的确切内容以及书名中数据的关系,有许多选项可供选择

我冒昧地猜测,书名中每一行的ISBN都是唯一的。假设是这样的话,那么就把你的主键改成只在ISBN上,然后把BookCopy改成你有ISBN而不是书名,然后加入ISBN

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

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

您需要

  • BookTitle中标题的唯一索引
  • BookCopy中的ISBN列,FK位于两列上

外键需要唯一标识父行:由于标题不唯一,您目前无法这样做。

BookTitle
有一个复合键。因此,如果
BookTitle
的键被引用为
外键
,则必须携带完整的复合键

因此,要解决此问题,您需要在
BookCopy
中添加完整的复合键。因此,还要添加
ISBN
列。他们在最后

foreign key (ISBN, Title) references BookTitle (ISBN, Title)

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

如果该剂量有效:

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

那么这可能会起作用(不是针对这个特定示例,而是一般情况):


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

谢谢!我终于克服了那个愚蠢的错误。解释为什么顺序很重要。这是因为当您有外键时,不必扫描目标表以使关系正确?不,这是因为外键在概念上总是映射到父表中的一行。这是通过表上的唯一约束实现的,该约束在许多RDBMS上作为索引实现。但不一定是这样。对,我认为这是一个更好更简单的解释。