2009-04-16 123 views
2

我有以下表格:SQL級聯刪除沒有外鍵?

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

我不使用外鍵和不打算這樣做,我想做的事,現在是能夠在一個查詢中的TableAdapter國表的刪除國家和所有相關區域,地區...

如何?

回答

10

在一個查詢中?我懷疑你可以。

但是你可以做一個三:

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' 

話雖這麼說,我強烈建議你重新考慮使用外鍵關係和級聯刪除用於這一目的。

+6

+1對於「強烈建議您重新考慮使用外鍵關係」 – 2009-04-16 08:45:23

4

使用交易。啓動一個事務,然後使用三個DELETE語句,然後使用COMMIT TRANSACTION語句。

0

如果您的數據庫支持該觸發器,然後使用觸發器內的事務,則可以使用觸發器。只要區域或區域被刪除,觸發器就會執行。

3

你可以嘗試一個存儲過程沿着這些線路:

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

編寫存儲過程來做這件事不僅微不足道,而且它也更加明顯。我不知道任何人誰甚至使用級聯刪除了。我從未在生產環境中使用過它。這太危險了,並不明顯。 – 2009-04-16 08:59:52

1

什麼喬恩說。另外,

Areas.RegionID和Regions.CountryID確實是外鍵。

即使你不這樣聲明它們。不宣佈他們加速你的數量微乎其微,但它也允許你在這兩列(字段)中存儲非法值。您想要防止這些列中出現無效插入,原因與要級聯刪除的原因相同。