没有外键的SQL级联删除?
我有以下表格:没有外键的SQL级联删除?,sql,database,Sql,Database,我有以下表格: Country: Country_ID, CountryName Regions: Region_ID, RegionName, Country_ID Areas: Area_ID, AreaName, RegionID 我没有使用外键,也不打算这样做,我现在想做的就是能够在国家表的tableAdapter中的一个查询中删除国家和所有相关的地区、地区 如何使用?使用事务。启动一个事务,然后使用三个DELETE语句,然后使用COMMIT transaction语句。在一个查询中?
Country: Country_ID, CountryName
Regions: Region_ID, RegionName, Country_ID
Areas: Area_ID, AreaName, RegionID
我没有使用外键,也不打算这样做,我现在想做的就是能够在国家表的tableAdapter中的一个查询中删除国家和所有相关的地区、地区
如何使用?使用事务。启动一个事务,然后使用三个DELETE语句,然后使用COMMIT transaction语句。在一个查询中?我怀疑你能 但你可以在三分钟内完成:
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'
尽管如此,我强烈建议您重新考虑使用外键关系和级联删除来实现此目的。如果您的数据库支持触发器,则可以使用触发器,然后在触发器内使用事务。每当删除一个区域或区域时,触发器都会执行。您可以尝试以下方式的存储过程:
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
乔恩说的。而且
Areas.RegionID和Regions.CountryID实际上是外键
即使你没有申报。不声明它们只会大大加快速度,但它也允许您在这两列(字段)中存储非法值。出于与级联删除相同的原因,您希望防止在这些列中进行无效插入 +1表示“强烈建议重新考虑使用外键关系”,编写存储过程来实现这一点不仅简单,而且更为明显。我不知道还有谁再使用cascade delete了。我从未在生产环境中使用过它。这太危险了,而且不明显。