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?

¿Fue útil?

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.

enter image description here

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top