SQL Cascading удалить без внешних ключей? - PullRequest
2 голосов
/ 16 апреля 2009

У меня есть следующие таблицы:

Country: Country_ID, CountryName
Regions: Region_ID, RegionName, Country_ID
Areas: Area_ID, AreaName, RegionID

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

Как?

Ответы [ 5 ]

10 голосов
/ 16 апреля 2009

В одном запросе? Я сомневаюсь, что вы могли.

Но вы могли бы сделать это за три:

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'

При этом я настоятельно рекомендую вам пересмотреть использование отношений внешних ключей и каскадного удаления для этой цели.

4 голосов
/ 16 апреля 2009

Использование транзакций. Начните транзакцию, затем используйте три оператора DELETE, затем оператор COMMIT TRANSACTION.

3 голосов
/ 16 апреля 2009

Вы можете попробовать хранимую процедуру следующим образом:

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
1 голос
/ 16 апреля 2009

Что сказал Джон. Кроме того,

Areas.RegionID и Regions.CountryID действительно являются внешними ключами.

Даже если вы не объявите их таковыми. Не объявляя их, вы ускоряете на тривиальную сумму, но это также позволяет вам хранить незаконные значения в этих двух столбцах (полях). Вы хотите предотвратить недопустимые вставки в эти столбцы по той же причине, по которой вы хотите каскадное удаление.

0 голосов
/ 16 апреля 2009

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

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