我有3个SQL Server表:
Country
(int)的id
表
带有City
(int)id
表
CountryCity
表countryId
(int)和cityId
(int)在我的Country
表中,我添加了规则delete cascade
,因此当我从CountryId
表中删除Country
时,与CityId
相关的所有CountryCity
国家/地区将在我的City
表中删除。
但我delete cascade
表中的ID也没有删除?
我甚至在CountryCity
表格中添加了规则{{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
。