2013-01-02 2 views
1

외래 키와 관련된 문제가 있습니다.SQL 외래 키 문제 삭제

고객 테이블 :
CustomerID를
이름
주소

송장 나는이 두 테이블, 고객 및 송장이 있으며, 그들은 다음과 같이 SQL 서버 2008

을 사용하고 있습니다 표 :
인보이스 ID
날짜
CustomerID

Customer 테이블의 CustomerID 열은 기본 키이고 Invoice 테이블의 CustomerID 열에는 외래 키가 있습니다.

고객 테이블에서 행을 삭제하려고하는데 이 없으면 송장 테이블에서 연결된 행이 삭제됩니다. 그렇게 할 수있는 방법이 있습니까?

편집 :
나는 삭제 된 고객은 로그 테이블에 저장되고, 그래서 ID가 여전히 존재한다고 언급하는 것을 잊었다하지만, 다른 테이블

+5

의도적으로 데이터 무결성 문제를 만들려 하시겠습니까? 그 고객이 사라졌을 때 송장 표에서 고객 ID 53의 의미는 무엇입니까? – Randy

+1

을 삭제하면 FK 값을 null로 케스케이드 할 수 있어야합니다. – Randy

+1

고객을 비활성으로 표시하기 만하면됩니다. 여전히 기록이 필요합니다. – Ben

답변

6

에서 "나는을 삭제하려면 행을 고객 테이블에 있지만, Invoice 테이블의 연결된 행을 삭제하지 않아도됩니다. "

외래 키의 전체 및 전체 점이이를 방지하기위한 것입니다.

제약 조건은 송장이 고객에 속해야한다는 규칙을 적용합니다. 인보이스가 고객의 것이 아닌 경우 애플리케이션에서 어떤 의미가 있습니까? 대신 무엇을 속해야합니까?

또는 비즈니스 용어로 표시하려면 인보이스에 고객 을 지불하지 않은 경우? copurse의


, 내 폭언 Invoice.CustomnerID이 필수 열임을 가정합니다. 데이터 모델이 선택 사항 일 수 있습니다. 어떤 경우에는 열을 NULL로 설정 한 다음 고객 레코드를 삭제할 수 있습니다. 기본 비즈니스 규칙이 주어지면 송장을 지불해야합니다 (또는 회사가 파산합니다). 이것이 데이터 모델에 결함이있는 것 같지만, 이봐 요!

+1

그 외에도 ERP 시스템에서는 고객 테이블 항목을 사용하지 않도록 설정하는 것이 일반적입니다 (고객이 더 이상 활동하지 않고 역사적인 이유로 데이터베이스에만 보관 됨). – Najzero

+0

맞지만 삭제 된 고객이 로그 테이블에 저장된다는 사실을 잊어 버렸기 때문에 ID가 여전히 존재하지만 다른 테이블에는 다른 솔루션이 있습니까? – Marc

+2

@Marc - 왜 'is_deleted' 플래그 또는'deleted_date'가 아닌 별도의 테이블입니까? 활동중인 고객 만 보여줄 수있는 뷰를 필터링 할 수 있습니다. –

0

여기 에서처럼 SQL Management Studio에서 FK 제약 조건을 조정하십시오. 강조 표시된 삭제 규칙은 관련된 테이블 레코드에 암시하려는 적용 유형을 설명합니다. 드롭 다운에서 기본값으로 설정되거나 Null로 설정 될 수 있습니다. . 이미지 첨부를 고려하십시오.

enter image description here