2009-04-16 7 views
2

Je les tableaux suivants:SQL Suppression en cascade sans clé étrangère?

Country: Country_ID, CountryName 
Regions: Region_ID, RegionName, Country_ID 
Areas: Area_ID, AreaName, RegionID 

Je ne suis pas utiliser les clés étrangères et ne prévoient pas de le faire, tout ce que je veux faire est maintenant de pouvoir dans une requête dans le TableAdapter de la table de pays supprimer Pays et toutes les régions, zones connexes ...

Comment?

Répondre

10

Dans une requête? Je doute que tu puisses.

Mais vous pouvez le faire en trois:

delete from Areas where RegionID in (select Region_ID from Regions where Country_ID in (select Country_ID where CountryName='Somelandia')) 
delete from Regions where Country_ID in (select Country_ID where CountryName='Somelandia') 
delete from Country where CountryName = 'Somelandia' 

Cela étant dit, je vous recommande vivement l'utilisation reconsidérer les relations clés étrangères et de suppression en cascade à cet effet.

+6

+1 pour «vous recommandons fortement de reconsidérer en utilisant des relations de clés étrangères» –

4

Utiliser les transactions. Commencez une transaction, puis utilisez trois instructions DELETE, puis l'instruction COMMIT TRANSACTION.

0

Vous pouvez utiliser un déclencheur si votre base de données le prend en charge, puis utiliser une transaction dans le déclencheur. Le déclencheur s'exécutera chaque fois qu'une région ou une zone est supprimée.

3

Vous pouvez essayer une procédure stockée le long de ces lignes:

create proc EraseCountry 
(
    @countryid int 
) 
as 

BEGIN TRY 
BEGIN TRANSACTION 

    delete areas 
    from areas 
     inner join regions on areas.region_id = regions.region_id 
    where regions.countryid = @countryid 

    delete regions 
    where countryid = @countryid 

    delete country 
    where countryid = @countryid 

COMMIT TRAN 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
    ROLLBACK TRAN 
END CATCH 
GO 
+0

Il est non seulement trivial d'écrire une procédure stockée pour ce faire, mais c'est aussi beaucoup plus évident. Je ne connais personne qui utilise même cascade supprimer plus. Je ne l'ai jamais utilisé dans un environnement de production. C'est trop dangereux et pas évident. –

1

Qu'est-ce que Jon a dit. En outre,

Areas.RegionID et Regions.CountryID sont réellement des clés étrangères.

Même si vous ne les déclarez pas comme tels. Ne pas les déclarer vous accélère d'un montant trivial, mais vous permet également de stocker des valeurs illégitimes dans ces deux colonnes (champs). Vous souhaitez empêcher les insertions non valides dans ces colonnes pour la même raison que vous souhaitez supprimer les suppressions.

Questions connexes