SQL Додати зовнішній ключ до існуючого стовпця


110

Якщо я використовую таку команду SQL у SQL Server 2008 для оновлення таблиці з обмеженням зовнішнього ключа:

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

UserIDбудучи моїм стовпцем ФК у Employeesтаблиці. Я намагаюся посилатися на посилання UserIDв моїй ActiveDirectoriesтаблиці. Я отримую цю помилку:

Зовнішній ключ "UserID" посилається на недійсний стовпець "UserID" у таблиці таблиці "Співробітники".


1
Не могли б ви надати схему двох таблиць?
Стефан Н

Відповіді:


191

Помилка вказує на те, що у таблиці Співробітників немає стовпця UserID. Спробуйте спочатку додати стовпець, а потім повторно запустіть оператор.

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

Це було правильно. Наш БД не оновлював наш стовпець додавання. Це було вирішено, але не те, що наш стовпець встановлений, я все одно не можу додати обмеження. 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'.
ВинятокLimeCat

Схоже, на який стовпець, на який посилається FK__Eposleees__UserI__04E4BC85, не визначено як ПЕРВІЙНИЙ КЛЮЧ або ключ-кандидат у таблиці ActiveDirectories.
BluesRockAddict

так, але це, безумовно, наш ПК у таблиці ActiveDirectories
ExceptionLimeCat

1
ВИРІШЕНО: Є причина, чому ви створюєте ERD та встановлюєте відносини перед побудовою. У нас було занадто багато записів в одній таблиці, що спричинило помилку при спробі створити відносини до іншої таблиці. Дякую усім.
ExceptionLimeCat


19

Можливо, ви отримали свої стовпчики назад ??

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

Чи може бути так, що стовпець називається і IDв Employeesтаблиці, і UserIDв ActiveDirectoriesтаблиці?

Тоді ваша команда повинна бути:

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

1
Я знаю його дивне, але, на жаль, ім'я в ідентифікаторі таблиці ActiveDirectory
ExceptionLimeCat

5

MySQL / SQL Server / Oracle / MS Access:

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

Щоб дозволити іменування обмеження FOREIGN KEY та для визначення обмеження FOREIGN KEY у кількох стовпцях, використовуйте такий синтаксис 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
Надайте пояснення зі своєю відповіддю
fen1x

0

спосіб створення зовнішнього ключа правильний для ActiveDirectories (id), я думаю, що головна помилка полягає в тому, що ви не згадали про первинний ключ для id в таблиці ActiveDirectories


0

У майбутньому.

ALTER TABLE Employees
ADD UserID int;

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.