2009-07-22 6 views
4

Existe-t-il une syntaxe spéciale pour exécuter une suppression en cascade sur DB2 ou est-il seulement possible de créer des tables "cascadables" en les définissant avec l'option "ON DELETE CASCADE"? Ce que j'essaye de réaliser est de supprimer d'autres lignes de table basées sur une même clé étrangère quand je supprime cette clé, mais ceci est fait sur une base de données déjà existante et remplie de données.DB2 cascade delete commande?

Répondre

8

Comme vous l'avez dit, vous devez soit créer avec un ON DELETE CASCADE FKs clause ou à avant de supprimer les autres lignes avec une sous-sélection-supprimer.

Donc, si vous n'avez pas vous devez faire

DELETE FROM ORDERS_ITEMS WHERE ORDER_ID in (
    SELECT ORDER_ID FROM ORDERS WHERE STATUS = 'Canceled' 
); 

DELETE FROM ORDERS_ADDRESS WHERE ORDER_ID in (
    SELECT ORDER_ID FROM ORDERS WHERE STATUS = 'Canceled' 
); 

DELETE FROM ORDERS WHERE STATUS = 'Canceled'; 

clause ON DELETE CASCADE Il est simple, mais est un peu redondant de sorte que vous pouvez utiliser l'instruction WITH.

Si la requête pour sélectionner les lignes requises est assez grand, et si vous ne vous pouvez pas avoir au moins un niveau d'isolation RR, utiliser un TEMPORARY table:

DECLARE GLOBAL TEMPORARY TABLE TMP_IDS_TO_DELETE (ID BIGINT) NOT LOGGED; 

INSERT INTO SESSION.TMP_IDS_TO_DELETE (ID) 
    SELECT ORDER_ID FROM ORDERS WHERE STATUS = 'Canceled'; 

DELETE FROM ORDERS_ITEMS WHERE ORDER_ID in (
    SELECT ID FROM SESSION.TMP_IDS_TO_DELETE 
); 


DELETE FROM ORDERS_ADDRESS WHERE ORDER_ID in (
    SELECT ID FROM SESSION.TMP_IDS_TO_DELETE 
); 

DELETE FROM ORDERS WHERE ORDER_ID in (
    SELECT ID FROM SESSION.TMP_IDS_TO_DELETE 
); 

Cette De cette façon, vous êtes sûr que vous allez supprimer les mêmes lignes dans chaque table, et une erreur FK se déclenchera encore si vous manquez quelque chose. Par défaut, la table temporaire se videra elle-même lors de la validation.