Sql 被引用表中没有与外键中的引用列列表匹配的主键或候选键
在SQL Server中,我遇到了以下错误-> “引用的表中没有主键或候选键 与外键中的引用列列表匹配的“BookTitle” “FK_书籍副本_标题__2F10007B.” 我首先创建了一个名为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)
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上作为索引实现。但不一定是这样。对,我认为这是一个更好更简单的解释。