Problema de doble clave extranjera compacta SQL compacta
-
24-10-2019 - |
Pregunta
A continuación se muestra una versión básica de la base de datos:
Preguntas
uid - clave primaria - int
QID - Clave primaria - Identidad - Bigint
img - nchar
PostDate - DateTime
Título - NCHAR
Perfil del usuario
Correo electrónico - nchar
UserID - Clave principal - Idendity - int
Votos
QID - Clave principal - Bigint
uid - clave primaria - int
Votado - DateTime
Voto - Bit
El problema que estoy teniendo es que quiero que los votos sean la clave extranjera de usertable y QID de votos que son la clave extranjera de las preguntas (QID obviamente). Cuando trato de agregar relaciones con WebMatrix, sigo recibiendo el error "La tabla referenciada debe tener una clave primaria o candidata". ¿Qué estoy haciendo mal?
Solución
Una clave extranjera debe hacer referencia a una clave única de otra tabla. De su pregunta, no está claro si tiene la intención de que el item1 o el item2 sea el PK, o si la combinación de (item1, item2) es única. Si es la combinación, ese es el único enlace válido para una clave extranjera de otra tabla.
La PK de las preguntas está hecha de dos columnas, por lo que para crear un FK de voto a pregunta, necesita 2 columnas para unirse a ella. Sin embargo, sería mejor crear un PK simple con una sola columna. Entonces, tu FK funcionará.
Votes qid - primary key - bigint uid - primary key - int votedate - datetime vote - bit Questions qid - primary key - identity - bigint uid - int img - nchar postdate - datetime title - nchar
Puede crear un índice en la pregunta (UID, QID) pero no lo haga el PK.
Otros consejos
No está familiarizado con WebMatrix, por lo que no sé si, en particular, tiene un problema con las teclas compuestas.
Sin embargo, noto que la clave principal en las preguntas es (UID, QID) y eso no es compatible con tener QID en los votos (por sí mismo) ser una clave extranjera para las preguntas.
create table UserProfile (
UserID integer identity primary key
, Email nvarchar(512)
);
create table Question (
QuestionID integer identity primary key
, OwnerID integer
, PostDate datetime
, Title nvarchar(1000)
);
alter table Question
add constraint fk1_Question foreign key (OwnerID) references UserProfile (UserID);
create table Vote (
UserID integer
, QuestionID integer
, VoteDate datetime
);
alter table Vote
add constraint pk1_Vote primary key (UserID, QuestionID)
, add constraint fk1_Vote foreign key (UserID) references UserProfile (UserID);
, add constraint fk2_Vote foreign key (QuestionID) references Question (QuestionID);
Tuve el mismo problema y accidentalmente encontré una solución.
Debe asegurarse de que la tabla de índice de clave primaria tenga el mismo orden de campos que en la relación.