Bagaimana cara menjatuhkan kunci asing di SQL Server?

201

Saya telah membuat kunci asing (dalam SQL Server) dengan:

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

Saya kemudian menjalankan kueri ini:

alter table company drop column CountryID;

dan saya mendapatkan kesalahan ini:

Msg 5074, Level 16, Negara 4, Baris 2
Objek 'Company_CountryID_FK' tergantung pada kolom 'CountryID'.
Msg 4922, Level 16, Negara 9, Baris 2
ALTER TABLE DROP COLUMN CountryID gagal karena satu atau lebih objek mengakses kolom ini

Saya sudah mencoba ini, namun sepertinya tidak berhasil:

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

Apa yang harus saya lakukan untuk menjatuhkan CountryIDkolom?

Terima kasih.

mmattax
sumber
2
Kesalahan apa yang Anda coba jatuhkan kunci asing?
ddc0660
2
Perlu diketahui bahwa berbahaya untuk menjatuhkan batasan kunci asing tanpa mengetahui mengapa itu ada di tempat pertama. Jika Anda baru saja membuat ini dan melakukannya secara tidak sengaja maka gunakan kode yang disediakan di jawaban lain. Jika tidak, maka jangan jatuhkan kendala sampai Anda yakin bahwa Anda tidak akan merusak sesuatu dengan melakukannya. Kendala dibuat untuk menegakkan aturan bisnis dan lebih baik untuk memastikan mereka tidak perlu lagi sebelum menjatuhkannya.
HLGEM
Sintaks Anda untuk menjatuhkan FK tidak perlu kata-kata "kunci asing". Ini adalah sintaks untuk MySQL, bukan SQL Server. Anda dapat menggantinya dengan kata "kendala".
John Gilmer

Jawaban:

314

Mencoba

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID
Mike
sumber
49

Ini akan berhasil:

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

Saya pikir ini akan membantu Anda ...

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)

Ini akan menghapus batasan kunci asing berdasarkan tabel dan kolom tertentu.

Samir Savasani
sumber
2
Terima kasih Samir. Generalisasi hebat.
kuklei
19

Pertama periksa keberadaan kendala lalu jatuhkan.

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

Saya tidak tahu MSSQL tetapi apakah itu tidak:

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

Anda juga dapat mengklik kanan pada tabel, memilih memodifikasi, lalu pergi ke atribut, klik kanan padanya, dan pilih drop primary key.

Gerardo Jaramillo
sumber
1

Apakah Anda mencoba untuk menghilangkan batasan FK atau kolom itu sendiri?

Untuk menghilangkan batasan:

alter table company drop constraint Company_CountryID_FK

Anda tidak akan bisa menjatuhkan kolom sampai Anda menjatuhkan batasan.

Philip Wade
sumber