Comment supprimer une clé étrangère dans SQL Server?

201

J'ai créé une clé étrangère (dans SQL Server) en:

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

Je lance ensuite cette requête:

alter table company drop column CountryID;

et j'obtiens cette erreur:

Msg 5074, niveau 16, état 4, ligne 2
L'objet 'Company_CountryID_FK' dépend de la colonne 'CountryID'.
Msg 4922, niveau 16, état 9, ligne 2
ALTER TABLE DROP COLUMN CountryID a échoué car un ou plusieurs objets accèdent à cette colonne

J'ai essayé cela, mais cela ne semble pas fonctionner:

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

Que dois-je faire pour supprimer la CountryIDcolonne?

Merci.

mmattax
la source
2
Quelle erreur obtenez-vous en essayant de supprimer la clé étrangère?
ddc0660
2
Sachez simplement qu'il est dangereux de supprimer une contrainte de clé étrangère sans savoir pourquoi elle existe en premier lieu. Si vous venez de le créer et que vous l'avez fait par erreur, utilisez le code fourni dans les autres réponses. Sinon, ne lâchez pas la contrainte jusqu'à ce que vous soyez sûr de ne pas casser quelque chose d'autre en le faisant. Des contraintes sont créées pour appliquer les règles de busness et il est préférable de s'assurer qu'elles ne sont plus nécessaires avant de les supprimer.
HLGEM le
Votre syntaxe pour supprimer le FK n'a pas besoin des mots "clé étrangère". Il s'agit de la syntaxe pour MySQL, pas pour SQL Server. Vous pouvez le remplacer par le mot "contrainte".
John Gilmer

Réponses:

314

Essayer

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID
Mike
la source
49

Cela fonctionnera:

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

Je pense que cela vous sera 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)

Il supprimera la contrainte de clé étrangère basée sur une table et une colonne spécifiques.

Samir Savasani
la source
2
Merci Samir. Grande généralisation.
kuklei
19

Vérifiez d'abord l'existence de la contrainte puis supprimez-la.

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

Je ne connais pas MSSQL mais ne serait-ce pas:

alter table company drop **constraint** Company_CountryID_FK;
Dave Costa
la source
1

Vous pouvez également cliquer avec le bouton droit sur le tableau, choisir de modifier, puis aller à l'attribut, cliquer avec le bouton droit dessus et choisir supprimer la clé primaire.

Gerardo Jaramillo
la source
1

Essayez-vous de supprimer la contrainte FK ou la colonne elle-même?

Pour supprimer la contrainte:

alter table company drop constraint Company_CountryID_FK

Vous ne pourrez pas supprimer la colonne tant que vous n'aurez pas supprimé la contrainte.

Philip Wade
la source