2014-01-13 1 views
1

다른 테이블에 존재하지 않는 값을 허용하는 외래 키 제약 조건을 테이블에 추가 할 수 있습니까?"NOT IN"논리를 사용하여 외래 키 제약 조건을 생성 할 수 있습니까?

아래 예에서 두 테이블 모두 USER_ID 필드를 포함합니다. 제약 조건은 고객과 직원이 동일한 USER_ID 값을 가질 수 없다는 것입니다.

나는 새 테이블을 추가하거나 어떤 식 으로든 테이블 중 하나를 변경하는 데 매우 제한적입니다.

CUSTOMER 
-------------------------- 
USER_ID  varchar2(10) 

EMPLOYEE 
-------------------------- 
USER_ID  varchar2(10) 

나는 같은 테이블이나 I 수정할 수있는 테이블에 삽입 트리거를 추가 양의 데이터가 포함 된보기로, 몇 가지 해결 방법을 생각했다.

+1

데이터 모델과 같은 소리가 엉망입니다. 이것은 FK가 아닙니다. FK는 한 테이블에서 다른 테이블의 필드와 관련된 필드입니다. 여기에서는 상호 배타적 일 필요가있는 두 개의 IDS 만 있습니다. – OldProgrammer

+0

은 USER 테이블의 user_id입니까? (직원이 고객이 될 수 없다는 의미)? – tbone

답변

0

다른 사람이 제안한대로 데이터 모델을 변경하려는 경우가 아니라면 상호 배타를 유지하면서 기존 구조를 진행하는 가장 간단한 방법은 두 테이블의 user_ids에 대해 check 제약 조건을 발행하여 상호 배타적으로 만 유효성 검사를 수행하는 것입니다 독점 시리즈.

예를 들어 고객에게 짝수 번호가 지정되고 직원에게 홀수 번호가 지정되도록 (또는 그 반대) 검사를 실행할 수 있습니다.

또는 IDS가 모두 varchar이므로 ID가 'EMP'또는 'CUST'와 같이 알려진 하위 문자열로 시작한다는 check 제약 조건을 사용하도록 규정합니다.

그러나 이들은 단지 트릭이며 관계형입니다. 이상적으로는 데이터 모델을 수정하는 것이 좋습니다. 희망이 도움이됩니다.

1

아니요, 그런 것은 존재하지 않지만, 위조가 가능합니다.

보기/트리거보다 훨씬 좋은이 관계형을 수행하려는 경우 쉬운 옵션은 모든 직원 ID에 E을 추가하고 모든 고객 ID에 C을 추가하는 것입니다. 그러나 다른 속성이 있고 그 속성이 동일한 사람이 아닌지 확인하려는 경우 (즉, ID에만 관심이없는 경우)이 방법은 효과가 없습니다. 이것은 당신이 세 번째 테이블을 만드는 데 필요한 경우라면

,의는 사람을 부르 자 :

create table people ( 
    user_id varchar2(10) not null 
, user_type varchar2(1) not null 
, constraint pk_people primary key (user_id) 
, constraint chk_people_user_types check (user_type in ('C','E')) 
    ); 

C이 점검 제한 조건에있는 직원에 대한 고객 및 E 스탠드 것입니다. 내가 여기 중지하고 완전히 고객 및 직원 테이블을 드롭 것, 개인적으로

create index ui_people_id_type on people (user_id, user_type); 

; 그런 사람들에 고유 인덱스/제약 조건을 만들 필요가 그들은 더 이상 사용하지 않으며 당신의 문제는 해결되었습니다.

새 열/테이블을 추가 할 수없는 경우 담당자에게 말하고 변경해야한다고 설득해야합니다. 지나친 복잡성은 논리와 혼란의 오류로 이어질뿐입니다 (보기를 사용하면 테이블을 유지하기 위해 많은 트리거가 필요하다는 것을 의미하고, 누군가가 뷰를 업데이트 만하도록해야한다는 것을 의미합니다). 시간이 오래 걸리더라도 제대로 일을하는 것이 훨씬 쉽습니다.


그러나, 당신은 정말 자신의 USER_TYPE을 포함하고 항상 테이블, 즉 모든 행에 대해 동일합니다 수 있도록 당신이 당신의 고객 및 직원 테이블을 변경 계속할 것인지:

alter table customers add user_type default 'C' not null; 
alter table customers add constraint chk_customers_type 
     check (user_type is not null and user_type = 'C');