Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有外键的SQL级联删除?_Sql_Database - Fatal编程技术网

没有外键的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了。我从未在生产环境中使用过它。这太危险了,而且不明显。