Wie lösche ich einen Fremdschlüssel in SQL Server?

201

Ich habe einen Fremdschlüssel (in SQL Server) erstellt von:

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

Ich führe dann diese Abfrage aus:

alter table company drop column CountryID;

und ich bekomme diesen Fehler:

Nachricht 5074, Ebene 16,
Status 4, Zeile 2 Das Objekt 'Company_CountryID_FK' ist abhängig von der Spalte 'CountryID'.
Meldung 4922, Ebene 16,
Status 9, Zeile 2 ALTER TABLE DROP COLUMN CountryID ist fehlgeschlagen, da ein oder mehrere Objekte auf diese Spalte zugreifen

Ich habe es versucht, aber es scheint nicht zu funktionieren:

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

Was muss ich tun, um die CountryIDSpalte zu löschen ?

Vielen Dank.

mmattax
quelle
2
Welchen Fehler erhalten Sie beim Löschen des Fremdschlüssels?
ddc0660
2
Beachten Sie jedoch, dass es gefährlich ist, eine Fremdschlüsseleinschränkung zu löschen, ohne zu wissen, warum sie überhaupt vorhanden ist. Wenn Sie dies gerade erstellt haben und es versehentlich getan haben, verwenden Sie den in den anderen Antworten angegebenen Code. Wenn nicht, lassen Sie die Einschränkung erst fallen, wenn Sie sicher sind, dass Sie damit nichts anderes brechen. Einschränkungen werden erstellt, um Busness-Regeln durchzusetzen, und es ist besser sicherzustellen, dass sie nicht mehr benötigt werden, bevor sie gelöscht werden.
HLGEM
Ihre Syntax zum Löschen des FK benötigt nicht die Wörter "Fremdschlüssel". Dies ist die Syntax für MySQL, nicht für SQL Server. Sie können es durch das Wort "Einschränkung" ersetzen.
John Gilmer

Antworten:

313

Versuchen

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID
Mike
quelle
48

Das wird funktionieren:

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

Ich denke, das wird dir helfen ...

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)

Die Fremdschlüsseleinschränkung wird basierend auf einer bestimmten Tabelle und Spalte gelöscht.

Samir Savasani
quelle
2
Danke Samir. Große Verallgemeinerung.
Kuklei
19

Überprüfen Sie zuerst die Existenz der Einschränkung und lassen Sie sie dann fallen.

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

Ich kenne MSSQL nicht, aber wäre es nicht:

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

Sie können auch mit der rechten Maustaste auf die Tabelle klicken, Ändern auswählen, dann zum Attribut gehen, mit der rechten Maustaste darauf klicken und Primärschlüssel löschen auswählen.

Gerardo Jaramillo
quelle
1

Versuchen Sie, die FK-Einschränkung oder die Spalte selbst zu löschen?

So löschen Sie die Einschränkung:

alter table company drop constraint Company_CountryID_FK

Sie können die Spalte erst löschen, wenn Sie die Einschränkung löschen.

Philip Wade
quelle