아니요, 그런 것은 존재하지 않지만, 위조가 가능합니다.
보기/트리거보다 훨씬 좋은이 관계형을 수행하려는 경우 쉬운 옵션은 모든 직원 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');
출처
2014-01-13 20:28:51
Ben
데이터 모델과 같은 소리가 엉망입니다. 이것은 FK가 아닙니다. FK는 한 테이블에서 다른 테이블의 필드와 관련된 필드입니다. 여기에서는 상호 배타적 일 필요가있는 두 개의 IDS 만 있습니다. – OldProgrammer
은 USER 테이블의 user_id입니까? (직원이 고객이 될 수 없다는 의미)? – tbone