SQL删除Cascade运行不正常

时间:2016-03-09 19:44:58

标签: sql sql-server tsql cascade

我有3个SQL Server表:

    带有Country(int)的
  1. id表 带有City(int)
  2. id
  3. CountryCitycountryId(int)和cityId(int)
  4. 在我的Country表中,我添加了规则delete cascade,因此当我从CountryId表中删除Country时,与CityId相关的所有CountryCity国家/地区将在我的City表中删除。

    但我delete cascade表中的ID也没有删除?

    我甚至在CountryCity表格中添加了规则{{1}}。

1 个答案:

答案 0 :(得分:1)

Country和City表ID列都作为FK映射到CountryCity表。

通过在Country和City上放置DELETE CASCADE规则,当删除Country或City表中的行时,将导致从映射表中删除行。

如果删除Country表中的行,则不会影响City表,反之亦然。这是因为DELETE CASCADE用于删除其他表中的所有引用行,即表中与当前表具有FK关系的行作为PK。 CountryCity是City和Country表的引用表。 City表未引用CountryCity表,因此CountryCity表上的DELETE CASCADE不会导致删除城市。

由于您需要此功能,因此下面提出了一种解决方案。不要使用DELETE CASCADE,而是自己处理删除,如下所示。

    CREATE PROCEDURE deleteCountry
        @countryID NVARCHAR(500) 
    AS 
        BEGIN 
            CREATE TABLE #temp(CityId INT)

            INSERT INTO #temp(CityId)
            SELECT DISTINCT CC.CityId 
                FROM CountryCity CC 
                WHERE CC.CountryID=@countryID

            DELETE FROM CountryCity WHERE CountryID=@countryID
            DELETE FROM Country WHERE ID=@countryID
            DELETE FROM City WHERE ID IN (SELECT CityID FROM #temp)

            DROP TABLE #temp

        END

另一种方法会导致您将设计从3个表格更改为2个表格结构,如下所示:

1 - 具有id(PK,int,NOT NULL)的国家/地区表

2 - 具有id(PK,int,NOT NULL)的City表,CountryId(FK,int,NULL)

并在国家/地区表格上应用DELETE CASCADE