2009-04-16 14 views
2

Ich habe die folgenden Tabellen:SQL Cascading Löschen ohne Fremdschlüssel?

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

ich keinen Fremdschlüssel verwenden und nicht so zu tun, plane, alles, was ich tun mag, jetzt in einer Abfrage in der Table der Ländertabelle zu können, ist Land zu löschen und alle verwandten Regionen, Bereiche ...

Wie?

Antwort

10

In einer Abfrage? Ich bezweifle, dass du es könnte.

Aber Sie es in einem drei tun könnte:

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' 

Das, gesagt empfehle ich Ihnen zu diesem Zweck Fremdschlüsselbeziehungen und Kaskade löschen denken werden.

+6

+1 für "dringend empfohlen, dass Sie Fremdschlüsselbeziehungen überdenken" –

4

Transaktionen verwenden. Starten Sie eine Transaktion, verwenden Sie dann drei DELETE-Anweisungen und dann COMMIT TRANSACTION-Anweisung.

0

Sie können einen Trigger verwenden, wenn Ihre Datenbank dies unterstützt, und dann eine Transaktion innerhalb des Triggers verwenden. Der Trigger wird ausgeführt, sobald eine Region oder ein Bereich gelöscht wird.

3

Sie könnten eine gespeicherte Prozedur in dieser Richtung versuchen:

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

Es ist nicht nur trivial, eine gespeicherte Prozedur zu schreiben, um dies zu tun, aber es ist auch viel offensichtlicher. Ich kenne niemanden, der sogar Kaskadenlöschung mehr verwendet. Ich habe es noch nie in einer Produktionsumgebung verwendet. Es ist zu gefährlich und nicht offensichtlich. –

1

Was sagte Jon. Auch

Areas.RegionID und Regions.CountryID sind wirklich Fremdschlüssel.

Auch wenn Sie sie nicht als solche deklarieren. Wenn Sie sie nicht deklarieren, werden Sie um einen trivialen Betrag beschleunigt, aber Sie können auch illegitime Werte in diesen zwei Spalten (Feldern) speichern. Sie möchten ungültige Einfügungen in diesen Spalten aus demselben Grund verhindern, aus dem Sie Löschvorgänge kaskadieren möchten.