SQL Dodaj klucz obcy do istniejącej kolumny

110

Jeśli używam następującego polecenia SQL w programie SQL Server 2008, aby zaktualizować tabelę za pomocą ograniczenia klucza obcego:

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

UserIDbędąc moją kolumną FK w Employeestabeli. Próbuję odwołać się do UserIDw mojej ActiveDirectoriestabeli. Otrzymuję ten błąd:

Klucz obcy „ID użytkownika” odwołuje się do nieprawidłowej kolumny „ID użytkownika” w tabeli odniesienia „Pracownicy”.

ExceptionLimeCat
źródło
1
Czy możesz podać schemat dwóch tabel?
Stefan H
skieruj

Odpowiedzi:

191

Błąd wskazuje, że w tabeli Pracownicy nie ma kolumny ID użytkownika. Spróbuj najpierw dodać kolumnę, a następnie ponownie uruchom instrukcję.

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);
BluesRockAddict
źródło
To było poprawne. Nasza baza danych nie aktualizowała naszej kolumny dodawania. Zostało to rozwiązane, ale nie oznacza to, że nasza kolumna została ustalona. Nadal nie mogę dodać ograniczenia. 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
Wygląda na to, że dowolna kolumna, do której odwołuje się FK__Employees__UserI__04E4BC85, nie jest zdefiniowana jako KLUCZ PODSTAWOWY lub klucz kandydujący w tabeli ActiveDirectories.
BluesRockAddict
tak, ale to zdecydowanie nasz PK w tabeli ActiveDirectories
ExceptionLimeCat
1
ROZWIĄZANE: Istnieje powód, dla którego tworzysz ERD i nawiązujesz relacje przed budowaniem. W jednej tabeli mieliśmy zbyt wiele rekordów, co spowodowało błąd podczas próby utworzenia relacji z drugą tabelą. Dziękuje wszystkim.
ExceptionLimeCat
skieruj
19

Może masz swoje kolumny wstecz?

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

Czy to możliwe, że kolumna jest wywoływana IDw Employeestabeli i UserIDw ActiveDirectoriestabeli?

Wtedy twoje polecenie powinno brzmieć:

ALTER TABLE Employees
ADD FOREIGN KEY (ID)                   <-- column in table "Employees"
REFERENCES ActiveDirectories(UserID)   <-- column in table "ActiveDirectories" 
marc_s
źródło
1
Wiem, że to dziwne, ale niestety nazwa w identyfikatorze tabeli ActiveDirectory
ExceptionLimeCat
5

MySQL / SQL Server / Oracle / MS Access:

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

Aby umożliwić nazewnictwo ograniczenia KLUCZ OBCY i zdefiniowanie ograniczenia KLUCZ OBCY w wielu kolumnach, należy użyć następującej składni języka SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
Venkatesh Bandarapu
źródło
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
źródło
5
Powinieneś wyjaśnić swoją odpowiedź
fen1x
0

sposób tworzenia klucza obcego poprawny dla ActiveDirectories (id), myślę, że głównym błędem jest to, że nie wspomniałeś o kluczu podstawowym dla id w tabeli ActiveDirectories

Siva Ramakrishna
źródło
0

W przyszłości.

ALTER TABLE Employees
ADD UserID int;

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);
Krishneil
źródło