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».

ExceptionLimeCat
la source
1
Pouvez-vous fournir le schéma de vos deux tables?
Stefan H
référez-vous à ce lien stackoverflow.com/questions/35196951/…
Jigar Darji

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);
BluesRockAddict
la source
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
référez-vous à ce lien stackoverflow.com/questions/35196951/…
Jigar Darji
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" 
marc_s
la source
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)
Venkatesh Bandarapu
la source
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
Sandy Bhardwaj
la source
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

Siva Ramakrishna
la source
0

A l'avenir.

ALTER TABLE Employees
ADD UserID int;

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