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