In SQL Server , I got this error ->

"引用的表中没有主键或候选键

我首先创建了一个名为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关系,因为出现了上述错误.

我真的很感激一些有用的帮助.

推荐答案

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

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

根据书名的确切内容以及书名中数据的关系,您可以 Select 许多选项.

我冒昧地猜测,书名中每一行的ISBN都是唯一的.假设是这样的话,那么就把你的主键改成只在ISBN上,然后把BookCopy改成你有ISBN而不是书名,然后加入ISBN.

如果需要将主键保持为ISBN, Title,则需要在BookCopy中存储ISBN以及两列上的标题和外键,或者需要在BookTitle(Title)上创建一个唯一的索引作为不同的索引.

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

Sql相关问答推荐

如何将varchar传递给tvf并使用该参数来查询结果SQL服务器

如何在一个范围内进行分组.""范围值在范围表中定义

为什么在这种情况下我不能使用LAG函数?

SQL Oracle条件分组依据

SQL:计算与另一列中给定值互斥的匹配项

查找表中特定值的上次更新日期

如何从Spark SQL的JSON列中提取动态数量的键值对

从结果SQL查询中排除空值

在SQL中将项分配给容器

将SQL Server查询改进为;线程安全;

从选定记录中提取摘要作为值的划分

试图找到两个身份列表的交集(列表的长度不同),但获取列 id 不明确?

BigQuery数组是否包含NULL值的判断方法

在where语句中使用CTE非常缓慢

REGEXP_SUBSTR使用方法

如何在 ClickHouse SQL 中使用 CTE 将邻居语句中的数字作为偏移量传递?

BigQuery Pivot 遗漏行

T-SQL - 返回每条记录的最近雇佣日期

为每组填写行以进行旋转

PostgreSQL Select 具有两列的自引用