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.
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.
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)
Vous avez besoin soit
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.
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)