我有以下表格:SQL級聯刪除沒有外鍵?
Country: Country_ID, CountryName
Regions: Region_ID, RegionName, Country_ID
Areas: Area_ID, AreaName, RegionID
我不使用外鍵和不打算這樣做,我想做的事,現在是能夠在一個查詢中的TableAdapter國表的刪除國家和所有相關區域,地區...
如何?
我有以下表格:SQL級聯刪除沒有外鍵?
Country: Country_ID, CountryName
Regions: Region_ID, RegionName, Country_ID
Areas: Area_ID, AreaName, RegionID
我不使用外鍵和不打算這樣做,我想做的事,現在是能夠在一個查詢中的TableAdapter國表的刪除國家和所有相關區域,地區...
如何?
在一個查詢中?我懷疑你可以。
但是你可以做一個三:
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'
話雖這麼說,我強烈建議你重新考慮使用外鍵關係和級聯刪除用於這一目的。
使用交易。啓動一個事務,然後使用三個DELETE語句,然後使用COMMIT TRANSACTION語句。
如果您的數據庫支持該觸發器,然後使用觸發器內的事務,則可以使用觸發器。只要區域或區域被刪除,觸發器就會執行。
你可以嘗試一個存儲過程沿着這些線路:
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
編寫存儲過程來做這件事不僅微不足道,而且它也更加明顯。我不知道任何人誰甚至使用級聯刪除了。我從未在生產環境中使用過它。這太危險了,並不明顯。 – 2009-04-16 08:59:52
什麼喬恩說。另外,
Areas.RegionID和Regions.CountryID確實是外鍵。
即使你不這樣聲明它們。不宣佈他們加速你的數量微乎其微,但它也允許你在這兩列(字段)中存儲非法值。您想要防止這些列中出現無效插入,原因與要級聯刪除的原因相同。
+1對於「強烈建議您重新考慮使用外鍵關係」 – 2009-04-16 08:45:23