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

时间:2013-07-26 11:04:58

标签: sql sql-server key candidate

在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 个答案:

答案 0 :(得分:54)

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

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

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

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

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

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

答案 1 :(得分:13)

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

如果这个剂量起作用:

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

然后这可能有用(不是针对这个具体的例子,而是一般):

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

答案 2 :(得分:6)

你需要

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

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

答案 3 :(得分:3)

BookTitle有一个复合键。因此,如果BookTitle的密钥被引用为foreign key,则必须提供完整的复合密钥。

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

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