web-dev-qa-db-fra.com

Il n'y a pas de clé primaire ou candidate dans la table référencée qui correspond à la liste de colonnes de référence dans la clé étrangère

Dans SQL Server, j'ai eu cette erreur ->

"Il n'y a pas de clé primaire ou candidate dans la table référencée 'BookTitle' correspondant à la liste de colonnes référençantes dans la clé étrangère 'FK _BookCopy _ Titre__2F10007B'."

J'ai d'abord créé une relation appelée la relation 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))

Ensuite, j'ai créé une relation appelée la relation BookCopy. Cette relation doit faire référence à la clé primaire de la relation 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))

Mais je ne peux pas créer la relation BookCopy car l'erreur mentionnée ci-dessus est apparue.

J'apprécie vraiment une aide utile.

40
user2622438

Les clés étrangères fonctionnent en reliant une colonne à une clé unique dans une autre table. Cette clé unique doit être définie comme une forme d'index unique, qu'il s'agisse de la clé primaire ou d'un autre index unique.

Pour le moment, le seul index unique que vous avez est un indice composé sur ISBN, Title qui est votre clé primaire.

Plusieurs options s'offrent à vous, en fonction de ce que contient exactement BookTitle et de la relation entre les données qu'il contient.

Je suppose que l'ISBN est unique pour chaque ligne de BookTitle. Dans l'hypothèse où tel est le cas, modifiez votre clé primaire pour n'être que sur ISBN et modifiez BookCopy afin qu'au lieu de Titre, vous ayez l'ISBN et rejoignez-le.

Si vous devez conserver votre clé primaire en tant que ISBN, Title vous devez soit stocker l'ISBN dans BookCopy, ainsi que le titre et la clé étrangère des deux colonnes, OR vous devez créer un index unique sur BookTitle (Titre) distinct). indice.

Plus généralement, vous devez vous assurer que la ou les colonnes que vous avez dans votre clause REFERENCES correspondent exactement à un index unique dans la table parente: dans votre cas, cela échoue car vous n'avez pas d'index unique unique sur Title seul.

55
Chris J

Un autre problème est que si vos clés sont très compliquées, vous devez parfois remplacer les emplacements des champs et cela aide:

si ce dosage fonctionne:

clé étrangère (ISBN, titre) références BookTitle (ISBN, titre)

Ceci pourrait alors fonctionner (pas pour cet exemple spécifique mais en général):

clé étrangère (titre, ISBN) références BookTitle (titre, ISBN)

13
Dan

Vous avez besoin soit

  • Un index unique sur Title dans BookTitle
  • Une colonne ISBN dans BookCopy et le FK est sur les deux colonnes

Une clé étrangère doit identifier de manière unique la ligne parente: vous n’avez actuellement aucun moyen de le faire car Titre n’est pas unique.

6
gbn

BookTitle possède une clé composite. donc si la clé de BookTitle est référencée comme un foreign key vous devez apporter la clé composite complète.

Donc, pour résoudre le problème, vous devez ajouter la clé composite complète dans le BookCopy. Ajoutez donc également la colonne ISBN. et ils à la fin.

foreign key (ISBN, Title) references BookTitle (ISBN, Title)
3
Talha Ahmed Khan