我有以下表格:
Country: Country_ID, CountryName
Regions: Region_ID, RegionName, Country_ID
Areas: Area_ID, AreaName, RegionID
我没有使用外键而且没有计划这样做,我现在要做的就是能够在tableAdapter of country table中的一个查询中删除国家和所有相关区域,区域......
如何?
答案 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)
如果数据库支持触发器,则可以使用触发器,然后在触发器内使用事务。只要删除某个区域或区域,就会执行触发器。