Как мне удалить внешний ключ в SQL Server?

201

Я создал внешний ключ (в SQL Server) с помощью:

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

Затем я запускаю этот запрос:

alter table company drop column CountryID;

и я получаю эту ошибку:

Сообщение 5074, уровень 16, состояние 4, строка 2
Объект «Company_CountryID_FK» зависит от столбца «CountryID».
Сообщение 4922, уровень 16, состояние 9, строка 2:
ошибка ALTER TABLE DROP COLUMN CountryID, так как один или несколько объектов имеют доступ к этому столбцу

Я попробовал это, но это, похоже, не работает:

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

Что мне нужно сделать, чтобы опустить CountryIDстолбец?

Спасибо.

mmattax
источник
2
Какую ошибку вы получаете, пытаясь удалить внешний ключ?
ddc0660
2
Просто имейте в виду, что отбрасывать ограничение внешнего ключа опасно, не зная, почему оно стоит на первом месте. Если вы только что создали это и сделали это по ошибке, используйте код, указанный в других ответах. Если нет, то не сбрасывайте ограничение до тех пор, пока вы не будете уверены, что не нарушите что-то еще этим. Ограничения создаются для обеспечения соблюдения правил работы, и лучше быть уверенным, что они больше не нужны, прежде чем их отбрасывать.
HLGEM
w3schools.com/sql/sql_foreignkey.asp
Мохаммед Замир
Ваш синтаксис для удаления FK не нуждается в словах "внешний ключ". Это синтаксис для MySQL, а не SQL Server. Вы можете заменить его словом «ограничение».
Джон Гилмер

Ответы:

314

Пытаться

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID
Майк
источник
49

Это будет работать:

ALTER TABLE [dbo].[company] DROP CONSTRAINT [Company_CountryID_FK]
Джаред
источник
23

Я думаю, что это будет полезно для вас ...

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)

Он удалит ограничение внешнего ключа на основе конкретной таблицы и столбца.

Самир Савасани
источник
2
Спасибо Самир. Отличное обобщение.
kuklei
19

Сначала проверьте наличие ограничения, затем отбросьте его.

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
Наим Икбал
источник
11
alter table company drop constraint Company_CountryID_FK
Бос
источник
4

Я не знаю MSSQL, но не будет ли это:

alter table company drop **constraint** Company_CountryID_FK;
Дейв Коста
источник
1

Вы также можете щелкнуть правой кнопкой мыши по таблице, выбрать изменить, затем перейти к атрибуту, щелкнуть правой кнопкой мыши по нему и выбрать опускать первичный ключ.

Херардо Харамильо
источник
1

Вы пытаетесь удалить ограничение FK или сам столбец?

Чтобы снять ограничение:

alter table company drop constraint Company_CountryID_FK

Вы не сможете удалить столбец, пока не удалите ограничение.

Филип Уэйд
источник