54

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

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

4

4 回答 4

79

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

目前,您拥有的唯一唯一索引是一个复合索引,ISBN, Title它是您的主键。

有许多选项可供您选择,具体取决于 BookTitle 所持有的内容以及其中数据的关系。

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

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

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

于 2013-07-26T11:14:57.130 回答
21

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

如果这个剂量有效:

外键 (ISBN, Title) 参考书名 (ISBN, Title)

那么这可能会起作用(不适用于这个特定的例子,但一般来说):

外键 (Title,ISBN) 参考书名 (Title,ISBN)

于 2014-01-09T00:19:22.097 回答
6

你需要

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

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

于 2013-07-26T11:15:37.477 回答
5

BookTitle有一个复合键。因此,如果 key ofBookTitle被引用为 aforeign key你必须带上完整的复合键。

因此,要解决问题,您需要在BookCopy. 所以也添加ISBN列。最后是他们。

foreign key (ISBN, Title) references BookTitle (ISBN, Title)
于 2013-07-26T11:15:54.837 回答