SQL Ajouter une clé étrangère à une colonne existante


110

Si j'utilise la commande SQL suivante dans SQL Server 2008 pour mettre à jour une table avec une contrainte de clé étrangère:

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

UserIDétant ma colonne FK dans le Employeestableau. J'essaie de référencer le UserIDdans mon ActiveDirectoriestableau. Je reçois cette erreur:

La clé étrangère «UserID» fait référence à la colonne «UserID» non valide dans la table de référence «Employés».


1
Pouvez-vous fournir le schéma de vos deux tables?
Stefan H

Réponses:


191

Erreur indique qu'il n'y a aucune colonne UserID dans votre table Employés. Essayez d'abord d'ajouter la colonne, puis réexécutez l'instruction.

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

C'était correct. Notre base de données ne mettait pas à jour notre colonne d'ajout. Cela a été résolu mais pas que notre colonne soit établie je ne peux toujours pas ajouter la contrainte. 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

Il semble que la colonne référencée par FK__Employees__UserI__04E4BC85 n'est pas définie comme PRIMARY KEY ou candidate key dans la table ActiveDirectories.
BluesRockAddict

oui mais c'est définitivement notre PK dans la table ActiveDirectories
ExceptionLimeCat

1
RÉSOLU: il y a une raison pour laquelle vous créez des DRE et établissez des relations avant la construction. Nous avions trop d'enregistrements dans une table, ce qui a provoqué une erreur lors de la tentative de création des relations avec l'autre table. Merci a tous.
ExceptionLimeCat


19

Peut-être que vous avez vos colonnes à l'envers ??

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

Se pourrait-il que la colonne soit appelée IDdans le Employeestableau et UserIDdans le ActiveDirectoriestableau?

Ensuite, votre commande devrait être:

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

1
Je sais que c'est bizarre mais malheureusement le nom dans l'identifiant de la table ActiveDirectory
ExceptionLimeCat

5

Accès MySQL / SQL Server / Oracle / MS:

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

Pour autoriser la dénomination d'une contrainte FOREIGN KEY et pour définir une contrainte FOREIGN KEY sur plusieurs colonnes, utilisez la syntaxe SQL suivante:

Accès MySQL / SQL Server / Oracle / MS:

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
Vous devriez fournir quelques explications avec votre réponse
fen1x

0

manière de création de clé étrangère correcte pour ActiveDirectories (id), je pense que l'erreur principale est que vous n'avez pas mentionné la clé primaire pour l'id dans la table ActiveDirectories


0

A l'avenir.

ALTER TABLE Employees
ADD UserID int;

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.