В ссылочной таблице нет первичных ключей или ключей-кандидатов, соответствующих списку столбцов ссылок во внешнем ключе.

В 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)

Столкнулся сейчас с той же проблемой. Простое объяснение: ваша вторая таблица не имеет первичного ключа. Внешний ключ вашей первой таблицы должен быть первичным ключом в другой таблице, которую вы пытаетесь связать.

Другие вопросы по тегам