在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
关系,因为上面提到的错误出现了。
我非常感谢一些有用的帮助。
答案 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)
你需要
外键需要唯一标识父行:您目前无法这样做,因为Title不是唯一的。
答案 3 :(得分:3)
BookTitle
有一个复合键。因此,如果BookTitle
的密钥被引用为foreign key
,则必须提供完整的复合密钥。
因此,要解决此问题,您需要在BookCopy
中添加完整的复合键。因此,也要添加ISBN
列。他们最后。
foreign key (ISBN, Title) references BookTitle (ISBN, Title)