Como solto uma chave estrangeira no SQL Server?

201

Eu criei uma chave estrangeira (no SQL Server):

alter table company add CountryID varchar(3);
alter table company add constraint Company_CountryID_FK foreign key(CountryID) 
references Country;

Em seguida, executei esta consulta:

alter table company drop column CountryID;

e recebo este erro:

Msg 5074, Nível 16, Estado 4, Linha 2
O objeto 'Company_CountryID_FK' depende da coluna 'CountryID'.
Msg 4922, nível 16, estado 9, linha 2
ALTER TABLE DROP COLUMN CountryID falhou porque um ou mais objetos acessam esta coluna

Eu tentei isso, ainda não parece funcionar:

alter table company drop foreign key Company_CountryID_FK; 
alter table company drop column CountryID;

O que preciso fazer para soltar a CountryIDcoluna?

Obrigado.

mmattax
fonte
2
Que erro você tenta ao soltar a chave estrangeira?
ddc0660 18/09/08
2
Lembre-se de que é perigoso descartar uma restrição de chave estrangeira sem saber por que ela está presente em primeiro lugar. Se você acabou de criar isso e fez por engano, use o código fornecido nas outras respostas. Caso contrário, não elimine a restrição até ter certeza de que não quebrará outra coisa fazendo isso. Restrições são criadas para impor regras de negócios e é melhor ter certeza de que elas não são mais necessárias antes de removê-las.
HLGEM 18/09/08
Sua sintaxe para descartar o FK não precisa das palavras "chave estrangeira". Essa é a sintaxe do MySQL, não do SQL Server. Você pode substituí-lo pela palavra "restrição".
John Gilmer

Respostas:

314

Experimentar

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID
Mike
fonte
49

Isso funcionará:

ALTER TABLE [dbo].[company] DROP CONSTRAINT [Company_CountryID_FK]
Jared
fonte
23

Eu acho que isso será útil para você ...

DECLARE @ConstraintName nvarchar(200)
SELECT 
    @ConstraintName = KCU.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
    ON KCU.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG  
    AND KCU.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA 
    AND KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
WHERE
    KCU.TABLE_NAME = 'TABLE_NAME' AND
    KCU.COLUMN_NAME = 'TABLE_COLUMN_NAME'
IF @ConstraintName IS NOT NULL EXEC('alter table TABLE_NAME drop  CONSTRAINT ' + @ConstraintName)

Ele excluirá a restrição de chave estrangeira com base na tabela e coluna específicas.

Samir Savasani
fonte
2
Obrigado Samir. Ótima generalização.
Kuklei 28/03
19

Primeiro verifique a existência da restrição e depois a elimine.

if exists (select 1 from sys.objects where name = 'Company_CountryID_FK' and type='F')
begin
alter table company drop constraint  Company_CountryID_FK
end
Naeem Iqbal
fonte
11
alter table company drop constraint Company_CountryID_FK
boes
fonte
4

Eu não sei MSSQL, mas não seria:

alter table company drop **constraint** Company_CountryID_FK;
Dave Costa
fonte
1

Você também pode clicar com o botão direito na tabela, escolher modificar, acessar o atributo, clicar com o botão direito do mouse e escolher soltar chave primária.

Gerardo Jaramillo
fonte
1

Você está tentando eliminar a restrição FK ou a própria coluna?

Para eliminar a restrição:

alter table company drop constraint Company_CountryID_FK

Você não poderá soltar a coluna até soltar a restrição.

Philip Wade
fonte