SQL Cascading删除没有外键?

时间:2009-04-16 08:36:37

标签: sql database

我有以下表格:

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

我没有使用外键而且没有计划这样做,我现在要做的就是能够在tableAdapter of country table中的一个查询中删除国家和所有相关区域,区域......

如何?

5 个答案:

答案 0 :(得分: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'

话虽如此,我强烈建议您为此目的重新考虑使用外键关系和级联删除。

答案 1 :(得分:4)

使用交易。启动一个事务,然后使用三个DELETE语句,然后使用COMMIT TRANSACTION语句。

答案 2 :(得分: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

答案 3 :(得分:1)

Jon说的话。此外,

Areas.RegionID和Regions.CountryID确实是外键。

即使您没有声明它们。不声明它们会使你的速度变得微不足道,但它也允许你在这两列(字段)中存储非法值。您希望防止这些列中的无效插入,原因与您要级联删除的原因相同。

答案 4 :(得分:0)

如果数据库支持触发器,则可以使用触发器,然后在触发器内使用事务。只要删除某个区域或区域,就会执行触发器。