use*_*438 43 sql sql-server candidate key
在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))
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个称为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))
Run Code Online (Sandbox Code Playgroud)
但我无法创建BookCopy关系,因为上面提到的错误出现了.
我非常感谢一些有用的帮助.
Chr*_*s J 57
外键通过将列连接到另一个表中的唯一键来工作,并且该唯一键必须定义为某种形式的唯一索引,无论是主键还是其他一些唯一索引.
目前,您拥有的唯一唯一索引ISBN, Title是您的主键上的复合索引.
您可以使用多种选项,具体取决于BookTitle的确切内容以及其中的数据关系.
我猜测,对于BookTitle中的每一行,ISBN都是唯一的.假设是这种情况,然后将主键更改为仅在ISBN上,并更改BookCopy,以便您拥有ISBN而不是标题,并加入其中.
如果您需要保留主键,ISBN, Title则需要将ISBN存储在BookCopy以及标题和两列上的外键中,或者您需要在BookTitle(标题)上创建唯一索引作为不同的索引.
更一般地说,您需要确保REFERENCES子句中的一列或多列完全匹配父表中的唯一索引:在您的情况下,它会失败,因为您没有单独的唯一索引Title.
小智 13
另一件事是 - 如果您的密钥非常复杂,有时您需要替换字段的位置,这有助于:
如果这个剂量有效:
外键(ISBN,标题)引用BookTitle(ISBN,Title)
那么这可能会起作用(不是针对这个具体的例子,而是一般):
外键(标题,ISBN)参考BookTitle(标题,ISBN)
BookTitle有一个复合键。因此,如果将 of 的键BookTitle引用为 a foreign key,则必须携带完整的复合键。
所以要解决这个问题,你需要在BookCopy. 所以也添加ISBN列。他们在最后。
foreign key (ISBN, Title) references BookTitle (ISBN, Title)
Run Code Online (Sandbox Code Playgroud)