¿Cómo se suelta una clave foránea en SQL Server?

201

He creado una clave foránea (en SQL Server) por:

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

Luego ejecuto esta consulta:

alter table company drop column CountryID;

y me sale este error:

Msg 5074, Nivel 16, Estado 4, Línea 2
El objeto 'Company_CountryID_FK' depende de la columna 'CountryID'.
Mensaje 4922, Nivel 16, Estado 9, Línea 2
ALTER TABLE DROP COLUMN CountryID falló porque uno o más objetos acceden a esta columna

He intentado esto, pero no parece funcionar:

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

¿Qué debo hacer para soltar la CountryIDcolumna?

Gracias.

mmattax
fuente
2
¿Qué error aparece al intentar soltar la clave externa?
ddc0660
2
Solo tenga en cuenta que es peligroso eliminar una restricción de clave externa sin saber por qué está allí en primer lugar. Si acaba de crear esto y lo hizo por error, utilice el código proporcionado en las otras respuestas. De lo contrario, no elimine la restricción hasta que esté seguro de que no romperá otra cosa al hacerlo. Las restricciones se crean para hacer cumplir las reglas de negocio y es mejor asegurarse de que ya no sean necesarias antes de descartarlas.
HLGEM
Su sintaxis para soltar el FK no necesita las palabras "clave foránea". Esta es la sintaxis para MySQL, no para SQL Server. Puede reemplazarlo con la palabra "restricción".
John Gilmer

Respuestas:

314

Tratar

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID
Miguel
fuente
49

Esto funcionará:

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

Creo que esto te ayudará ...

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)

Eliminará la restricción de clave externa en función de una tabla y columna específicas.

Samir Savasani
fuente
2
Gracias Samir Gran generalización
kuklei
19

Primero verifique la existencia de la restricción y luego suéltela.

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
fuente
11
alter table company drop constraint Company_CountryID_FK
Boes
fuente
4

No sé MSSQL pero no sería:

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

También puede hacer clic derecho en la tabla, elegir modificar, luego ir al atributo, hacer clic derecho sobre él y elegir soltar la clave primaria.

Gerardo Jaramillo
fuente
1

¿Estás tratando de eliminar la restricción FK o la columna misma?

Para eliminar la restricción:

alter table company drop constraint Company_CountryID_FK

No podrá soltar la columna hasta que suelte la restricción.

Philip Wade
fuente