2009-12-03 3 views
2

다른 많은 테이블에서 참조하는 행을 기본 키 또는 외래 키로 삭제하는 방법은 무엇입니까?데이터베이스 행 및 해당 참조 삭제 - 모범 사례

적절한 순서로 각 참조를 삭제해야합니까, 아니면 이것을 수행하는 '자동'방법이 있습니까 (예 : linq to sql? 당신이 ON으로 설정 외부 키가 CASCADE 삭제이있는 경우

+0

어떤 버전의 SQL Server입니까? 좋은 읽을 거리 : http://www.mssqlcity.com/Articles/General/using_constraints.htm –

답변

1

, 그냥 마스터를 삭제하여 데이터베이스를 치기 알아서 할게요 WHERE ID = X

+0

2005 년 이상입니다. –

+1

은 이전 버전의 MS SQL Server를 사용하여 "모범 사례"와 반대가됩니다.) –

+0

@OMG, Sql 2000에는 참조 키 캐스케이드가 포함되어 있습니다 (예 : 삭제/업데이트 계단식). 삭제/업데이트 집합 x)은 2005+ 만 가능하지만 표준 삭제 계단식은 Sql 2000 + – chadhoc

5

당신이 저장을 통해 데이터 액세스를 모두 수행하는 경우 프로 시저를 누른 다음 마스터에 대한 저장 프로 시저를 삭제해야합니다. 당신은 새로운 관련 테이블을 추가 할 때 그것을 유지할 필요가 있지만, IMO는 자신이하는 일에 대해 생각할 것을 요구합니다. 이는 좋은 것입니다.

개인적으로, 나는 계단식 삭제에서 멀리 떨어져 있습니다. 사용자가 기존 어린이에 대해 경고를 받아야 할 때 실수로 많은 레코드를 삭제하는 것은 너무 쉽습니다.

+1

+1 - 사례를 본 적이 없습니다. 시스템에서 나는 계단식 삭제를 원했던 곳에서 일했습니다. 우리는 (예를 들어 Patient, Patient Detail과 같이 너무 중요했기 때문에) 삭제하지 않았거나 우리가 일반적으로 삭제할 수 없었던 외래 키를 사용하는 항목이 너무 많아서 조회 (lookups), 코드 테이블 (code table) etc) –

3

많은 경우 데이터베이스에서 항목을 삭제하는 가장 좋은 방법은 IsDeleted 열을 설정하고 다른 모든 쿼리에서 행을 무시하여 "사실상"삭제하는 것입니다.

삭제가 과도하게 연결된 테이블의 경우 매우 비쌀 수 있으며 잠금으로 인해 삭제가 진행되는 동안 다른 쿼리가 실패 할 수 있습니다.

"IsDeleted"행을 시스템에 영원히 남겨두면 (감사에 도움이 될 수 있음) 시스템이 유휴 상태 일 때 다시 돌아가 삭제할 수 있습니다.

+0

물론 이것은 삭제 된 행을 걸러내는 모든 선택을 복잡하게합니다. 나는 당신이 삭제보다 더 많은 선택을한다고 가정 할 때, 당신이 성능면에서 이것을 정당화 할 수 있는지 확신하지 못합니다. 그러나 감사/실행 취소 목적을 위해 나는 이것이 종종 바람직하다는 데 동의한다. – Draemon

관련 문제