В ссылочной таблице нет первичных или потенциальных ключей, которые соответствуют списку столбцов ссылок в внешнем ключе
В 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
, потому что появилась ошибка, указанная выше.
Я очень ценю полезную помощь.
Ответы
Ответ 1
Внешние ключи работают, присоединяя столбцы к уникальному ключу в другой таблице, и этот уникальный ключ должен быть определен как некоторая форма уникального индекса, будь то первичный ключ или какой-либо другой уникальный индекс.
В настоящий момент единственным уникальным индексом, который у вас есть, является составной на ISBN, Title
, который является вашим основным ключом.
Для вас есть несколько вариантов, в зависимости от того, что именно хранится в BookTitle, и отношения данных внутри него.
Я бы рискнул предположить, что ISBN уникален для каждой строки в BookTitle. В предположении, что это так, затем измените свой первичный ключ только на ISBN и измените BookCopy, чтобы вместо Title у вас был ISBN и присоединился к нему.
Если вам нужно сохранить свой первичный ключ как ISBN, Title
, вам нужно либо сохранить ISBN в BookCopy, либо Title, и внешний ключ в обоих столбцах, или вам нужно создать уникальный индекс в BookTitle (Title ) как отдельный индекс.
В более общем плане вам нужно убедиться, что столбец или столбцы, которые у вас есть в вашем предложении REFERENCES
, соответствуют точно уникальному индексу в родительской таблице: в вашем случае он терпит неудачу, потому что у вас нет единственного уникального индекса в Title
.
Ответ 2
Другое дело - если ваши ключи очень сложны, иногда вам нужно заменить места полей, и это помогает:
если этот доцент работает:
внешний ключ (ISBN, название) ссылки BookTitle (ISBN, название)
Тогда это может работать (не для этого конкретного примера, но в целом):
внешний ключ (название, ISBN) ссылки BookTitle (Title, ISBN)
Ответ 3
Вам нужно
- Уникальный индекс в Title в BookTitle
- Столбец ISBN в BookCopy и FK находится в обоих столбцах
Внешний ключ должен однозначно идентифицировать родительскую строку: у вас нет способа сделать это, потому что Title не уникален.
Ответ 4
BookTitle
имеют составной ключ. поэтому, если ключ BookTitle
указан как foreign key
, вы должны принести полный составной ключ.
Итак, чтобы решить проблему, вам нужно добавить полный составной ключ в BookCopy
. Поэтому добавьте столбец ISBN
. и они в конце.
foreign key (ISBN, Title) references BookTitle (ISBN, Title)