Как удалить FK и все записи в зависимой таблице? - PullRequest
2 голосов
/ 01 сентября 2010

Это тот случай.Есть 3 таблицы - штат, область и город.Если я удаляю штат с именем «Франция», я хочу, чтобы также были удалены все регионы и города, принадлежащие этому штату.Как это сделать в T-SQL?

Ответы [ 4 ]

3 голосов
/ 01 сентября 2010

Хотя Cascade-Delete - это то, что нужно, мне очень неудобно настраивать это.Это очень небезопасно, поэтому я никогда не настраиваю каскадное удаление.

Я предпочитаю делать это в TSQL

DELETE FROM Cities
WHERE RegionId IN 
(
    SELECT Id
    From Regions
    Where CountryId IN
    (
        Select Id
        From Country
        Where Country = 'France'
    )
)

, затем удаляю регионы

DELETE FROM Regions
Where RegionId IN
(
    Select Id
    From Country
    Where Country = 'France'
)

затем удалите страны

DELETE FROM Country
Where Country = 'France'
2 голосов
/ 01 сентября 2010

Самое простое решение - убедиться, что у вас включено каскадное удаление для связей между таблицами.

Create Table State
(
    Code char(2) not null Primary Key
    , ...
)
Create Table Region
(
    Code varchar(10) not null
    , StateCode char(2) not null
    , Constraint FK_Region_State 
        Foreign Key ( StateCode )
        References State( Code )
        On Delete Cascade
)
Create Table City
(
    Name varchar(40) not null
    , StateCode char(2) not null
    , RegionCode varchar(10) not null
    , Constraint FK_City_State 
        Foreign Key ( StateCode )
        References State( Code )
        On Delete Cascade
    , Constraint FK_City_Region
        Foreign Key ( StateCode )
        References State( Code )
        On Delete Cascade
)

Если по какой-то причине вы не можете включить Каскадное удаление, вам придется применять это правило с помощью триггера в таблице состояний.(Кстати, "государство" по имени Франция?)

2 голосов
/ 01 сентября 2010

Я предполагаю, что вы не настроили каскадное удаление , так что вам нужно пройти путь снизу вверх: сначала удалите города, затем регионы, затем штаты.

delete from c
    from city c
        inner join region r
            on c.region_id = r.region_id
        inner join state s
            on r.state_id = s.state_id
    where s.state = 'France'

delete from r
    from region r
        inner join state s
            on r.state_id = s.state_id
    where s.state = 'France'

delete from s
    from state s
    where s.state = 'France'
0 голосов
/ 01 сентября 2010

Вы можете настроить таблицы для каскадного удаления, поэтому вы удаляете запись из таблицы, к которой все имеют внешние ключи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...