Як я можу скинути іноземний ключ у 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'.
Msg 4922, рівень 16, стан 9, рядок 2
ПЕРЕДАЧА ТАБЛИЧНОГО КРАПУВАННЯ CountryID не вдалося, оскільки один або більше об'єктів отримують доступ до цього стовпця

Я спробував це, але, схоже, це не працює:

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

Що мені потрібно зробити, щоб скинути CountryIDстовпець?

Дякую.


2
З якою помилкою ви намагаєтесь скинути іноземний ключ?
ddc0660

2
Просто майте на увазі, що небезпечно скинути обмеження на зовнішній ключ, не знаючи, чому воно там на першому місці. Якщо ви щойно створили це і зробили це помилково, тоді використовуйте код, що вказаний в інших відповідях. Якщо ні, то не скидайте обмеження, поки не будете впевнені, що не будете порушувати щось інше, роблячи це. Обмеження створюються для виконання правил ділової активності, і краще бути впевненим, що вони більше не потрібні, перш ніж скидати їх.
HLGEM


У вашому синтаксисі для скидання FK не потрібні слова "зовнішній ключ". Це синтаксис для MySQL, а не SQL Server. Ви можете замінити його словом "обмеження".
Джон Гілмер

Відповіді:


313

Спробуйте

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID


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



1

Ви також можете клацнути правою клавішею миші на таблиці, вибрати модифікацію, потім перейти до атрибута, клацнути правою кнопкою миші на ньому та вибрати первинний ключ.


1

Ви намагаєтесь скинути обмеження FK або саму колонку?

Щоб скасувати обмеження:

alter table company drop constraint Company_CountryID_FK

Ви не зможете скинути стовпчик, поки не скасуєте обмеження.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.