SQL Aggiunge una chiave esterna alla colonna esistente


110

Se utilizzo il seguente comando SQL in SQL Server 2008 per aggiornare una tabella con un vincolo di chiave esterna:

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

UserIDessendo la mia colonna FK nella Employeestabella. Sto cercando di fare riferimento a UserIDnella mia ActiveDirectoriestabella. Ricevo questo errore:

La chiave esterna "ID utente" fa riferimento alla colonna "ID utente" non valida nella tabella di riferimento "Dipendenti".


1
Potresti fornire lo schema delle tue due tabelle?
Stefan H

Risposte:


191

L'errore indica che non è presente alcuna colonna UserID nella tabella Employees. Prova ad aggiungere prima la colonna e poi riesegui l'istruzione.

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

Questo era corretto. Il nostro DB non aggiornava la nostra colonna di aggiunta. Questo è stato risolto ma non che la nostra colonna sia stabilita non posso ancora aggiungere il vincolo. 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'.
Eccezione

Sembra che la colonna a cui fa riferimento FK__Employees__UserI__04E4BC85 non sia definita come PRIMARY KEY o chiave candidata nella tabella ActiveDirectories.
BluesRockAddict

sì, ma è sicuramente il nostro PK nella tabella ActiveDirectories
ExceptionLimeCat

1
RISOLTO: C'è un motivo per cui crei ERD e stabilisci relazioni prima della costruzione. Avevamo troppi record in una tabella che hanno causato un errore nel tentativo di creare le relazioni con l'altra tabella. Ringrazia tutti.
Eccezione


19

Forse hai le tue colonne al contrario ??

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

Potrebbe essere che la colonna sia chiamata IDnella Employeestabella e UserIDnella ActiveDirectoriestabella?

Quindi il tuo comando dovrebbe essere:

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

1
So che è strano ma sfortunatamente il nome nell'id della tabella ActiveDirectory
ExceptionLimeCat

5

MySQL / SQL Server / Oracle / MS Access:

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

Per consentire la denominazione di un vincolo FOREIGN KEY e per definire un vincolo FOREIGN KEY su più colonne, utilizzare la seguente sintassi 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
Dovresti fornire qualche spiegazione con la tua risposta
fen1x

0

modalità di creazione della chiave esterna corretta per ActiveDirectories (id), penso che l'errore principale sia che non hai menzionato la chiave primaria per l'ID nella tabella ActiveDirectories


0

Nel futuro.

ALTER TABLE Employees
ADD UserID int;

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.