SQL Adicionar chave estrangeira à coluna existente


110

Se eu estiver usando o seguinte comando SQL no SQL Server 2008 para atualizar uma tabela com uma restrição de chave estrangeira:

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

UserIDsendo minha coluna FK na Employeestabela. Estou tentando fazer referência a UserIDem minha ActiveDirectoriestabela. Recebo este erro:

A chave estrangeira 'ID do usuário' faz referência à coluna inválida 'ID do usuário' na tabela de referência 'Funcionários'.


1
Você poderia fornecer o esquema de duas tabelas?
Stefan H

Respostas:


191

Erro indica que não há coluna UserID em sua tabela Funcionários. Tente adicionar a coluna primeiro e, em seguida, execute novamente a instrução.

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

Isso estava correto. Nosso banco de dados não estava atualizando nossa coluna add. Isso foi resolvido, mas nossa coluna não foi estabelecida. Ainda não consigo adicionar a restrição. 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

Parece que qualquer coluna referenciada por FK__Employees__UserI__04E4BC85 não está definida como PRIMARY KEY ou chave candidata na tabela ActiveDirectories.
BluesRockAddict

sim, mas é definitivamente nosso PK na tabela ActiveDirectories
ExceptionLimeCat

1
RESOLVIDO: Há uma razão pela qual você cria ERDs e estabelece relacionamentos antes de construir. Tínhamos muitos registros em uma tabela, o que causou um erro ao tentar criar os relacionamentos com a outra tabela. Obrigado a todos.
ExceptionLimeCat


19

Talvez você tenha invertido suas colunas ??

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

Será que a coluna é chamada IDna Employeestabela e UserIDna ActiveDirectoriestabela?

Então, seu comando deve ser:

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

1
Eu sei que é estranho, mas infelizmente o nome no id da tabela ActiveDirectory
ExceptionLimeCat

5

Acesso MySQL / SQL Server / Oracle / MS:

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

Para permitir a nomenclatura de uma restrição FOREIGN KEY e para definir uma restrição FOREIGN KEY em várias colunas, use a seguinte sintaxe SQL:

Acesso MySQL / SQL Server / Oracle / MS:

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
Você deve fornecer alguma explicação com sua resposta
fen1x

0

forma de criação de chave estrangeira correta para ActiveDirectories (id), acho que o principal erro é que você não mencionou a chave primária para id na tabela ActiveDirectories


0

No futuro.

ALTER TABLE Employees
ADD UserID int;

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.