SQL级联删除没有外键?
问题描述:
我有以下表格: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
+0
编写存储过程来做这件事不仅微不足道,而且它也更加明显。我不知道任何人谁甚至使用级联删除了。我从未在生产环境中使用过它。这太危险了,并不明显。 – 2009-04-16 08:59:52
答
什么乔恩说。另外,
Areas.RegionID和Regions.CountryID确实是外键。
即使你不这样声明它们。不宣布他们加速你的数量微乎其微,但它也允许你在这两列(字段)中存储非法值。您想要防止这些列中出现无效插入,原因与要级联删除的原因相同。
+1对于“强烈建议您重新考虑使用外键关系” – 2009-04-16 08:45:23