Jak upuścić klucz obcy w SQL Server?


201

Utworzyłem klucz obcy (w SQL Server) przez:

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

Następnie uruchamiam to zapytanie:

alter table company drop column CountryID;

i pojawia się ten błąd:

Msg 5074, poziom 16, stan 4, wiersz 2
Obiekt „Company_CountryID_FK” jest zależny od kolumny „CountryID”.
Msg 4922, poziom 16, stan 9, wiersz 2
ZMIANA KOLUMNY KOLUMNY KRAJU Identyfikator kraju nie powiódł się, ponieważ jeden lub więcej obiektów ma dostęp do tej kolumny

Próbowałem tego, ale wydaje się, że to nie działa:

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

Co muszę zrobić, aby upuścić CountryIDkolumnę?

Dzięki.


2
Jaki błąd próbujesz upuścić klucz obcy?
ddc0660,

2
Wystarczy pamiętać, że usunięcie ograniczenia klucza obcego jest niebezpieczne, nie wiedząc, dlaczego znajduje się na pierwszym miejscu. Jeśli właśnie to utworzyłeś i zrobiłeś to przez pomyłkę, użyj kodu podanego w innych odpowiedziach. Jeśli nie, nie usuwaj ograniczenia, dopóki nie będziesz pewien, że nie złamiesz czegoś innego. Ograniczenia są tworzone w celu egzekwowania reguł biznesowych i lepiej jest mieć pewność, że nie są już potrzebne przed ich usunięciem.
HLGEM


Twoja składnia do upuszczania FK nie wymaga słów „klucz obcy”. To jest składnia MySQL, a nie SQL Server. Możesz go zastąpić słowem „ograniczenie”.
John Gilmer,

Odpowiedzi:


313

Próbować

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID

48

To zadziała:

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

23

Myślę, że to ci pomoże ...

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)

Spowoduje to usunięcie ograniczenia klucza obcego na podstawie określonej tabeli i kolumny.


2
Dzięki Samir. Świetne uogólnienie.
kuklei

19

Najpierw sprawdź istnienie ograniczenia, a następnie upuść je.

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

Nie znam MSSQL, ale czy nie byłoby to:

alter table company drop **constraint** Company_CountryID_FK;

1

Możesz także kliknąć tabelę prawym przyciskiem myszy, wybrać modyfikację, a następnie przejść do atrybutu, kliknąć go prawym przyciskiem myszy i wybrać upuszczenie klucza podstawowego.


1

Czy próbujesz usunąć ograniczenie FK lub samą kolumnę?

Aby usunąć ograniczenie:

alter table company drop constraint Company_CountryID_FK

Nie będziesz mógł upuścić kolumny, dopóki nie usuniesz ograniczenia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.