194 votes

Contrainte de clé étrangère SQL DROP TABLE

Si je veux supprimer toutes les tables de ma base de données de cette manière, cela prendra-t-il en charge la contrainte de clé étrangère ? Si ce n'est pas le cas, comment dois-je m'en occuper d'abord ?

GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
    DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
    DROP TABLE dbo.[Student]

387voto

marc_s Points 321990

Non, cela ne fera pas tomber votre table si des clés étrangères y font référence.

Pour obtenir toutes les relations de clé étrangère faisant référence à votre table, vous pouvez utiliser ce code SQL (si vous utilisez SQL Server 2005 et plus) :

SELECT * 
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

et s'il y en a, avec cette déclaration ici, vous pouvez créer des déclarations SQL pour supprimer ces relations FK :

SELECT 
    'ALTER TABLE [' +  OBJECT_SCHEMA_NAME(parent_object_id) +
    '].[' + OBJECT_NAME(parent_object_id) + 
    '] DROP CONSTRAINT [' + name + ']'
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

58voto

Riaan Points 39

Dans SQL Server Management Studio 2008 (R2) et les versions plus récentes, vous pouvez cliquer avec le bouton droit de la souris sur l'écran de l'ordinateur.

DB -> Tâches -> Générer des scripts

  • Sélectionnez les tables que vous souhaitez supprimer.

  • Sélectionnez "Enregistrer dans une nouvelle fenêtre de requête".

  • Cliquez sur le bouton Avancé.

  • Définissez script DROP et CREATE à script DROP.

  • Définir script Clés étrangères à True.

  • Cliquez sur OK.

  • Cliquez sur Suivant -> Suivant -> Terminer.

  • Visualisez le script et ensuite Exécuter.

33voto

Philip Kelley Points 19032

Si vous supprimez d'abord la table "enfant", la clé étrangère sera également supprimée. Si vous essayez de supprimer la table "parent" en premier, vous obtiendrez l'erreur "Could not drop object 'a' because it is referenced by a FOREIGN KEY constraint".

25voto

Krait Points 201

Voici une autre façon de faire tomber toutes les tables correctement, en utilisant sp_MSdropconstraints procédure. Le code le plus court auquel j'ai pu penser :

exec sp_MSforeachtable "declare @name nvarchar(max); set @name = parsename('?', 1); exec sp_MSdropconstraints @name";
exec sp_MSforeachtable "drop table ?";

2voto

Stas Svishov Points 193

Une version légèrement plus générique de ce que @mark_s a posté, ceci m'a aidé.

SELECT 
'ALTER TABLE ' +  OBJECT_SCHEMA_NAME(k.parent_object_id) +
'.[' + OBJECT_NAME(k.parent_object_id) + 
'] DROP CONSTRAINT ' + k.name
FROM sys.foreign_keys k
WHERE referenced_object_id = object_id('your table')

il suffit de brancher le nom de votre table, et d'exécuter le résultat de celle-ci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X