2009-04-16 98 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确实是外键。

即使你不这样声明它们。不宣布他们加速你的数量微乎其微,但它也允许你在这两列(字段)中存储非法值。您想要防止这些列中出现无效插入,原因与要级联删除的原因相同。