Come rilasciare una chiave esterna in SQL Server?


201

Ho creato una chiave esterna (in SQL Server) da:

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

Quindi eseguo questa query:

alter table company drop column CountryID;

e ottengo questo errore:

Messaggio 5074, livello 16, stato 4, riga 2
L'oggetto "Company_CountryID_FK" dipende dalla colonna "CountryID".
Messaggio 4922, livello 16, stato 9, riga 2
ALTER TABLE DROP COLUMN CountryID non riuscito perché uno o più oggetti accedono a questa colonna

Ho provato questo, ma non sembra funzionare:

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

Cosa devo fare per eliminare la CountryIDcolonna?

Grazie.


2
Quale errore viene visualizzato tentando di rilasciare la chiave esterna?
ddc0660,

2
Basta essere consapevoli del fatto che è pericoloso eliminare un vincolo di chiave esterna senza sapere perché è al primo posto. Se l'hai appena creato e lo hai fatto per errore, utilizza il codice fornito nelle altre risposte. In caso contrario, non eliminare il vincolo fino a quando non si è sicuri che non si romperà qualcos'altro in tal modo. I vincoli vengono creati per far rispettare le regole di business ed è meglio essere certi che non siano più necessari prima di eliminarli.
HLGEM,


La tua sintassi per far cadere l'FK non ha bisogno delle parole "chiave esterna". Questa è la sintassi per MySQL, non per SQL Server. Puoi sostituirlo con la parola "vincolo".
John Gilmer,

Risposte:


314

Provare

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID

49

Questo funzionerà:

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

23

Penso che questo ti sarà utile ...

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)

Eliminerà il vincolo di chiave esterna in base alla tabella e alla colonna specifiche.


2
Grazie Samir. Grande generalizzazione.
kuklei,

19

Prima controlla l'esistenza del vincolo, quindi rilascialo.

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

Non conosco MSSQL ma non sarebbe:

alter table company drop **constraint** Company_CountryID_FK;

1

Puoi anche fare clic con il pulsante destro del mouse sulla tabella, scegliere modifica, quindi andare all'attributo, fare clic con il pulsante destro del mouse su di essa e scegliere rilascia chiave primaria.


1

Stai cercando di eliminare il vincolo FK o la colonna stessa?

Per eliminare il vincolo:

alter table company drop constraint Company_CountryID_FK

Non sarai in grado di rilasciare la colonna fino a quando non rilasci il vincolo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.