【问题标题】:There are no primary or candidate keys in the referenced table that match the referencing column list in the foreign key被引用表中没有与外键中的引用列列表匹配的主键或候选键
【发布时间】:2013-07-26 15:04:16
【问题描述】:

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

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

【问题讨论】:

    标签: sql sql-server key candidate


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 这是因为当你有一个外键时,它不应该扫描目标表来建立关系吗?
    • 不,这是因为外键在概念上总是映射到父表中的单行。这是通过在许多 RDBMS 上作为索引实现的表上的唯一约束来强制执行的。但不一定是这样。
    • 对,我认为这是一个更好更简单的解释。
    【解决方案2】:

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

    如果这个剂量有效:

    外键(ISBN,书名)引用书名(ISBN,书名)

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

    外键(Title,ISBN)引用书名(Title,ISBN)

    【讨论】:

    【解决方案3】:

    你需要一个

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 2023-03-05
        相关资源
        最近更新 更多