Yabancı bir anahtarı SQL Server'da nasıl bırakabilirim?


202

Ben yabancı bir anahtar (SQL Server'da) oluşturduk:

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

Sonra bu sorguyu çalıştırın:

alter table company drop column CountryID;

ve bu hatayı alıyorum:

Msg 5074, Seviye 16, Durum 4, Satır 2
'Company_CountryID_FK' nesnesi 'CountryID' sütununa bağımlı.
Msg 4922, Seviye 16, Durum 9, Satır 2
ALTER TABLE DROP COLUMN CountryID, bir veya daha fazla nesne bu sütuna eriştiği için başarısız oldu

Bunu denedim, ama işe yaramıyor gibi görünüyor:

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

CountryIDSütunu bırakmak için ne yapmam gerekir ?

Teşekkürler.


2
Yabancı anahtarı düşürmeye çalışırken hangi hatayı alıyorsunuz?
ddc0660

2
Sadece neden ilk sırada orada olduğunu bilmeden bir yabancı anahtar kısıtlaması bırakmanın tehlikeli olduğunu unutmayın. Bunu yeni oluşturduysanız ve yanlışlıkla yaptıysanız, diğer yanıtlarda verilen kodu kullanın. Değilse, başka bir şeyi kıramayacağınızdan emin olana kadar kısıtlamayı düşürmeyin. Meşguliyet kurallarını uygulamak için kısıtlamalar yaratılır ve bunları bırakmadan önce artık ihtiyaç duymadıklarından emin olmak daha iyidir.
HLGEM


FK'yi bırakma sözdiziminizde "yabancı anahtar" kelimesi olması gerekmez. Bu, SQL Server için değil, MySQL için sözdizimidir. "Kısıtlama" kelimesi ile değiştirebilirsiniz.
John Gilmer

Yanıtlar:


315

Deneyin

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID

49

Bu çalışacak:

ALTER TABLE [dbo].[company] DROP CONSTRAINT [Company_CountryID_FK]

23

Bunun sana yardımcı olacağını düşünüyorum ...

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)

Belirli bir tablo ve sütuna göre yabancı Anahtar Kısıtlamasını silecektir.


2
Teşekkürler Samir. Büyük genelleme.
kuklei

19

Önce kısıtlamanın varlığını kontrol edin, sonra bırakın.

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 bilmiyorum ama değil mi:

alter table company drop **constraint** Company_CountryID_FK;

1

Ayrıca, tabloya Sağ Tıklayabilir, değiştir'i seçebilir, daha sonra özniteliğe gidebilir, sağ tıklayabilir ve birincil anahtarı bırak seçeneğini belirleyebilirsiniz.


1

FK kısıtlamasını mı yoksa sütunun kendisini mi düşürmeye çalışıyorsunuz?

Kısıtlamayı bırakmak için:

alter table company drop constraint Company_CountryID_FK

Kısıtlamadan çıkana kadar sütunu bırakamazsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.