sql - No hay claves principales o candidatas en la tabla a la que se hace referencia que coincidan con la lista de columnas de referencia en la clave externa
sql-server key (4)
En SQL Server, obtuve este error ->
"No hay claves principales o candidatas en la tabla a la que se hace referencia ''BookTitle'' que coinciden con la lista de columnas de referencia en la clave externa ''FK_ BookCopy _Title__2F10007B''."
Primero creé una relación llamada la relación 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))
Luego creé una relación llamada relación BookCopy
. Esta relación necesita hacer referencia a la clave primaria de la relación de BookTitle
libro, 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))
Pero no puedo crear la relación BookCopy
porque apareció el error indicado anteriormente.
Realmente aprecio algo de ayuda útil.
Las claves externas funcionan uniendo una columna a una clave única en otra tabla, y esa clave única debe definirse como alguna forma de índice único, ya sea la clave principal o algún otro índice único.
Por el momento, el único índice único que tiene es uno compuesto en ISBN, Title
que es su clave principal.
Hay una cantidad de opciones disponibles para usted, dependiendo de qué contiene exactamente BookTitle y la relación de los datos que contiene.
Me arriesgaría a suponer que el ISBN es único para cada fila en BookTitle. SI asume que este es el caso, cambie su clave principal para que esté solo en ISBN, y cambie BookCopy para que en lugar de Título tenga ISBN y se una a eso.
Si necesita conservar su clave principal como ISBN, Title
debe almacenar el ISBN en BookCopy, así como el Título y la clave externa en ambas columnas, O debe crear un índice único en BookTitle (Título) como índice distintivo.
De forma más general, debe asegurarse de que la columna o columnas que tiene en su cláusula REFERENCES
coincidan exactamente con un índice único en la tabla principal: en su caso falla porque no tiene un solo índice único en Title
.
Otra cosa es: si sus claves son muy complicadas, a veces debe reemplazar los lugares de los campos y eso ayuda:
si este dosent funciona:
clave externa (ISBN, Título) hace referencia a BookTitle (ISBN, Título)
Entonces esto podría funcionar (no para este ejemplo específico, sino en general):
claves extranjeras (Título, ISBN) referencias Título del libro (Título, ISBN)
Usted necesita cualquiera
- Un índice único en Title in BookTitle
- Una columna de ISBN en BookCopy y el FK está en ambas columnas
Una clave externa necesita identificar de manera única la fila principal: actualmente no tiene forma de hacerlo porque Title no es único.
BookTitle
tiene una clave compuesta. entonces, si la clave de BookTitle
se referencia como una foreign key
, debe traer la clave compuesta completa.
Para resolver el problema, debe agregar la clave compuesta completa en BookCopy
. Así que agrega una columna de ISBN
también. y ellos al final.
foreign key (ISBN, Title) references BookTitle (ISBN, Title)