2009-04-16 9 views
2

가 나는 다음과 같은 테이블이 : 나는 외래 키를 사용하지 그렇게 할 계획하고 있지 않다SQL 외래 키가없는 계단식 삭제?

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

를, 내가 싶어 모두가 지금 나라를 삭제하는 국가 테이블의 TableAdapter에 하나 개의 쿼리에서 할 수하는 것입니다 및 모든 관련 지역, 지역 ...

어떻게?

답변

10

하나의 검색어로? 나는 네가 할 수 있을지 의심한다.

그러나 세 A의 그것을 할 수는 :

말했다되고 그건
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' 

, 나는 강하게 당신이 외래 키 관계와 폭포가이 목적을 위해 삭제하여 재고 좋습니다.

+6

+1은 "외래 키 관계를 사용하여 재검토하는 것이 좋습니다" –

4

트랜잭션을 사용하십시오. 트랜잭션을 시작한 다음 세 개의 DELETE 문을 사용하고 COMMIT TRANSACTION 문을 사용하십시오.

0

데이터베이스에서 지원하는 경우 트리거를 사용하고 트리거 내에서 트랜잭션을 사용할 수 있습니다. 트리거는 영역이나 영역이 삭제 될 때마다 실행됩니다.

3

은 이러한 라인을 따라 저장 프로 시저를 시도 할 수 :

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 
+0

이 작업을 수행하려면 저장 프로 시저를 작성하는 것이 간단 할뿐만 아니라 훨씬 더 분명합니다. 캐스케이드 삭제를 더 이상 사용하지 않는 사람은 누구인지 알지 못합니다. 프로덕션 환경에서는 사용하지 않았습니다. 너무 위험하고 분명하지 않습니다. –

1

존 말했다 무엇. 또한

Areas.RegionID 및 Regions.CountryID는 실제로 외래 키입니다.

이렇게 선언하지 않더라도. 선언하지 않으면 사소한만큼 속도가 빨라지지만,이 두 열 (필드)에 불법적 인 값을 저장할 수도 있습니다. 삭제를 계단식으로 처리하는 것과 같은 이유로 해당 열의 유효하지 않은 삽입을 방지하려고합니다.

관련 문제