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


1
Czy możesz podać schemat dwóch tabel?
Stefan H

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);

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


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" 

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)

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


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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.