390 votes

Comment utiliser la suppression en cascade avec SQL Server ?

J'ai 2 tables : T1 et T2, ce sont des tables existantes avec des données. Nous avons une relation un à plusieurs entre T1 et T2. Comment puis-je modifier les définitions de table pour effectuer une suppression en cascade dans SQL Server lorsqu'un enregistrement de T1 est supprimé, tous les enregistrements associés dans T2 sont également supprimés.

La contrainte étrangère est en place entre eux. Je ne veux pas supprimer les tables ou créer un déclencheur pour effectuer la suppression pour T2. Par exemple, lorsque je supprime un employé, tous les enregistrements de révision doivent également disparaître.

T1 - Employé,

Employee ID      
Name
Status

T2 - Examens de performance,

Employee ID - 2009 Review
Employee ID - 2010 Review

432voto

Mike Gledhill Points 2105

Pour ajouter la "suppression en cascade" à une clé étrangère existante dans SQL Server Management Studio :

Tout d'abord, sélectionnez votre clé étrangère, et ouvrez son "DROP and Create To " dans une nouvelle fenêtre de requête.

enter image description here

Ensuite, il suffit d'ajouter ON DELETE CASCADE à la ADD CONSTRAINT commandement :

n Et cliquez sur le bouton "Exécuter" pour exécuter cette requête.

Au fait, pour obtenir une liste de vos clés étrangères, et voir lesquelles ont "Cascade delete" activé, vous pouvez exécuter ce script :

SELECT 
   OBJECT_NAME(f.parent_object_id) AS 'Table name',
   COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Field name',
   delete_referential_action_desc AS 'On Delete'
FROM sys.foreign_keys AS f,
     sys.foreign_key_columns AS fc,
     sys.tables t 
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
ORDER BY 1

Et si jamais tu trouves que tu ne peux pas DROP une table particulière en raison d'une contrainte de clé étrangère, mais vous ne pouvez pas déterminer quelle clé étrangère est à l'origine du problème, alors vous pouvez exécuter cette commande :

sp_help 'TableName'

Le SQL dans cet article liste tous les FKs qui font référence à une table particulière.

J'espère que tout cela vous aidera.

Mes excuses pour le long doigt. J'essayais juste de faire une remarque.

44 votes

Le doigt a vendu cette réponse immédiatement.

9 votes

Je viens de cliquer ici depuis la section "Images pour on delete cascade" d'une page de résultats d'un moteur de recherche, uniquement à cause du doigt. Qu'est-ce qui se passe avec cette chose.

410voto

marc_s Points 321990

Vous devrez ,

  • Supprimez la contrainte de clé étrangère existante,
  • Ajoutez-en un nouveau avec le ON DELETE CASCADE activé.

Quelque chose comme :

ALTER TABLE dbo.T2
   DROP CONSTRAINT FK_T1_T2   -- or whatever it's called

ALTER TABLE dbo.T2
   ADD CONSTRAINT FK_T1_T2_Cascade
   FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE

4 votes

Mon équipe et moi venons de faire ça. Nous avons dû supprimer nos contraintes et les ajouter à nouveau. Cela a fonctionné pour nous.

2 votes

En quoi est-ce en faveur d'une suppression pure et simple ? Une suppression douce n'aurait jamais de problème de contrainte. Il me semble que c'est plutôt le contraire.

3 votes

@Maxx Dans le cas d'une suppression définitive, vous supprimez un enregistrement et vous n'avez pas à vous soucier des registres orphelins, alors que dans le cas d'une suppression douce, vous devez le faire manuellement.

181voto

Palani Kumar Points 340

Vous pouvez le faire avec SQL Server Management Studio.

→ Cliquez avec le bouton droit de la souris sur la conception de la table et allez dans Relations et choisissez la clé étrangère dans le volet de gauche et dans le volet de droite, développez le menu "Spécification INSERT et UPDATE" et sélectionnez "Cascade" comme Règle de suppression.

SQL Server Management Studio

0 votes

Bonjour, quelle est la différence entre les 4, est-ce que l'activation de la cascade permet de supprimer facilement toutes les données d'une table. Comment puis-je voir toutes les dépendances/clés FK ? sur cette table, pas de cette table. Même après avoir supprimé tous les FK, j'obtiens toujours une erreur

0 votes

@aggie - Vous pouvez vérifier les dépendances en - cliquant avec le bouton droit de la souris sur la table -> "View Dependencies" De plus, sql server vous donnera l'erreur détaillée avec le nom de la table et le nom de la colonne comme ceci "L'instruction DELETE est en conflit avec la contrainte REFERENCE "FK_Child1_Parent1". Le conflit s'est produit dans la base de données "TESTDB", la table "dbo.Child1", la colonne 'Parent1ID'."

0 votes

@aggie - Aussi le 4ème cas "Set Default" est, vous devez définir la contrainte par défaut dans la colonne Foreign Key, lorsque nous supprimons le parent alors la valeur par défaut sera remplacée dans les tables enfant. (Note : La valeur par défaut doit correspondre à la table parente). mssqltips.com/sqlservertip/2365/

53voto

Hyperboreus Points 15985

Utilisez quelque chose comme

ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;

Remplissez les noms de colonnes corrects et vous devriez être prêt. Comme mark_s l'a correctement indiqué, si vous avez déjà une contrainte de clé étrangère en place, vous devrez peut-être d'abord supprimer l'ancienne, puis créer la nouvelle.

41 votes

@marc_s - en fait, vous pouvez ajouter une deuxième clé étrangère sur exactement les mêmes colonnes des deux côtés, et cela fonctionnera correctement. Si vous travaillez dans un environnement de production sans temps d'arrêt, il peut être préférable d'introduire la nouvelle clé étrangère en cascade, puis de supprimer l'ancienne clé étrangère, plutôt que de laisser une fenêtre sur la table lorsqu'aucune clé étrangère n'est en place. (Juste testé sur SQL 2008)

0 votes

C'est exact. J'ai essayé, et cela fonctionne. Il n'est pas nécessaire de supprimer les premières contraintes de clé étrangère. Merci pour votre réponse.

24voto

Md Shahriar Points 324

ON DELETE CASCADE
Il précise que les données enfant sont supprimées lorsque les données parent sont supprimées.

CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE CASCADE
);

Pour cette clé étrangère, nous avons spécifié le ON DELETE CASCADE qui indique au serveur SQL de supprimer les enregistrements correspondants dans la table enfant lorsque les données de la table parent sont supprimées. Ainsi, dans cet exemple, si une valeur product_id est supprimée de la table products, les enregistrements correspondants de la table inventory qui utilisent ce product_id seront également supprimés.

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