SQL Agregar clave externa a la columna existente


110

Si estoy usando el siguiente comando SQL en SQL Server 2008 para actualizar una tabla con una restricción de clave externa:

ALTER TABLE Employees
ADD FOREIGN KEY (UserID)
REFERENCES ActiveDirectories(id)

UserIDsiendo mi columna FK en la Employeestabla. Estoy tratando de hacer referencia a UserIDen mi ActiveDirectoriestabla. Recibo este error:

La clave externa 'UserID' hace referencia a la columna no válida 'UserID' en la tabla de referencia 'Empleados'.


1
¿Podría proporcionar el esquema de sus dos tablas?
Stefan H

Respuestas:


191

El error indica que no hay una columna de ID de usuario en su tabla de empleados. Intente agregar la columna primero y luego vuelva a ejecutar la declaración.

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);

Eso fue correcto. Nuestro DB no estaba actualizando nuestra columna de adición. Esto se ha resuelto pero no es que nuestra columna esté establecida, todavía no puedo agregar la restricción. There are no primary or candidate keys in the referenced table 'ActiveDirectories' that match the referencing column list in the foreign key 'FK__Employees__UserI__04E4BC85'.
ExceptionLimeCat

Parece que la columna a la que hace referencia FK__Employees__UserI__04E4BC85 no está definida como PRIMARY KEY o clave candidata en la tabla ActiveDirectories.
BluesRockAddict

sí, pero definitivamente es nuestro PK en la tabla ActiveDirectories
ExceptionLimeCat

1
RESUELTO: Hay una razón por la cual crea ERD y establece relaciones antes de construir. Teníamos demasiados registros en una tabla, lo que provocó un error al intentar crear las relaciones con la otra tabla. Gracias a todos.
ExceptionLimeCat


19

¿Quizás tienes tus columnas al revés?

ALTER TABLE Employees
ADD FOREIGN KEY (UserID)           <-- this needs to be a column of the Employees table
REFERENCES ActiveDirectories(id)   <-- this needs to be a column of the ActiveDirectories table

¿Podría ser que la columna se llame IDen la Employeestabla y UserIDen la ActiveDirectoriestabla?

Entonces tu comando debería ser:

ALTER TABLE Employees
ADD FOREIGN KEY (ID)                   <-- column in table "Employees"
REFERENCES ActiveDirectories(UserID)   <-- column in table "ActiveDirectories" 

1
Sé que es extraño, pero desafortunadamente el nombre en la identificación de la tabla ActiveDirectory
ExceptionLimeCat

5

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

Para permitir el nombramiento de una restricción FOREIGN KEY y para definir una restricción FOREIGN KEY en varias columnas, utilice la siguiente sintaxis SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

1
ALTER TABLE Faculty 
WITH CHECK ADD  CONSTRAINT FKFacultyBook
FOREIGN KEY FacId
REFERENCES Book Book_Id

ALTER TABLE Faculty 
WITH CHECK ADD  CONSTRAINT FKFacultyStudent 
FOREIGN KEY FacId
REFERENCES Student StuId

5
Debe proporcionar una explicación con su respuesta
fen1x

0

forma de creación de clave externa correcta para ActiveDirectories (id), creo que el error principal es que no mencionó la clave principal para id en la tabla ActiveDirectories


0

En el futuro.

ALTER TABLE Employees
ADD UserID int;

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.