2011-04-07 1 views
2

동료 중 한 명과 토론 할 때 SQL Server에서 외래 키 사용에 대해 알고 싶습니다.SQL Server의 외래 키

두 테이블이 외래 키를 통해 연결된 경우 부모 테이블에서 레코드가 삭제되면 하위 테이블의 동일한 참조 레코드도 삭제되어야한다고 생각합니다.

예를 들어, 표 1과 표 2의 두 가지 표가 있습니다. Table1에는 id = 1 인 레코드가 있고 Table2에는 id = 1 인 레코드가 두 개 있습니다. Table2는 하위 테이블이며 외래 키를 통해 Table1과 연결됩니다. 이제 Table1에서 id = 1 레코드를 삭제하려고하면 동시에 id = 1 (2 레코드)가 Table2에서 삭제되어야합니다.

그는 그것이 잘못되었다고 말합니다. 외래 키의 경우 두 테이블에서 레코드를 개별적으로 삭제해야합니다.

누가 맞습니까?

답변

3

두 답변을 모두 사용할 수 있으며 작동 할 수 있습니다.

귀하의 동료 버전은 귀하의 응용 프로그램 (또는 귀하의 DBA)이 삭제 작업을 할 때 더 많은 책임감을 부여합니다 : 응용 프로그램 (또는 DBA)은 먼저 자식 행을 확인하고 삭제 한 다음 부모 행을 삭제해야합니다. 이것은 효과가 있으며 예상치 못한 놀라움을주지 않습니다.

외래 키 제약 조건 (어떤 심각한 관계형 데이터베이스 시스템에서도 가능할 것입니다)에 ON DELETE CASCADE 옵션을 추가하면 비즈니스 포인트에서 설명하는 방식대로 동작하게됩니다 (예 : 주문의 모든 주문 항목 삭제). 그러나 다른 경우에는 전혀 이해가되지 않을 수 있습니다. 예를 들어 주문 번호 1234를 삭제하면 일반적으로 은 표시되지 않습니다.은 모든 제품을 삭제하려고합니다. 해당 주문의 주문 항목이 아마도 참조됩니다).

그래서 두 시나리오가 있습니다. 특정 시나리오에서는 모두 의미가 있지만 다른 시나리오에서는 그렇지 않습니다. 그것은 단순한 "- 또는"/ "옳은 것과 나쁜 것"이라는 질문이 아닙니다.

+0

좋은 답변이지만 'SQL 서버에서 외래 키 사용'에 대한 OP의 첫 번째 질문에 완전히 대답하지는 않습니다. 그러나 나는 그것이 범위와 다를 것이라고 생각합니다. –

+0

하지만 삭제 및 업데이트 외래 키에 대한 작업 없음으로 설정하고 부모 테이블에서 레코드를 삭제하려고하면 자식 테이블에서 외래 키 충돌에 대한 오류가 발생합니다. – Abbas

+0

@abbas : yes - "No Action"을 설정하면 ** 자식 행을 먼저 삭제하는 ** 책임이 있습니다. –

-2

외래 키가있는 테이블을 삭제했기 때문에 친구가 올바르게 참조 된 테이블이 자동 삭제되지 않는다고 생각합니다. 그러나 트리거를 설정할 수 있습니다.

외래 키는 주로 데이터 모델의 관계를 나타내는 데 사용되며 참조 테이블에있는 해당 키 값없이 데이터를 입력하면 오류가 발생하도록 테이블간에 데이터 무결성을 유지할 수도 있습니다 .

+1

에 대해 읽을 수 있지만 당신은 내가 그것을 자동으로하지 않습니다하지만 당신이 할 수있는 트리거를 추가 할 수 있다고 말했다 왜 – SQLMenace

+0

에'캐스케이드 delete'이있는 경우 그들은 할 수있다 ... – roberttdev

+0

을 당신은 트리거를 호출했는데, 계단식 삭제가 트리거가 아닙니다. – SQLMenace

1

사물이 어떻게 정의되는지에 따라 다릅니다. cascading delete을 가질 수도 있고 차단 한 것일 수도 있습니다 (먼저 삭제해야하는 곳, 다른 곳을 먼저 삭제해야하는 곳).

1

당신이 맞습니다.

캐스케이드 삭제가 활성화 된 경우 기본 키 행이 삭제되면 외래 키 행도 삭제됩니다.

1

캐스케이드에서 삭제할 수 있도록 만들어진 테이블을 만들 수 있습니다. 구속 조건을 지정해야하는 외래 키 제약 조건을 추가 할 때

CONSTRAINT fk1 
FOREIGN KEY(col) REFERENCES parent(col) ON DELETE CASCADE, 

그렇지 않으면 예, 먼저 자녀를 삭제해야합니다.