2012-11-05 2 views
3

레코드 세트가 테이블 B에 있는지 확인하기 위해 테이블 ​​A에 대한 제한 조건을 작성하려고합니다. 외래 키를 사용할 수는 있지만 테이블 B의 데이터는 비 - 독특한.고유하지 않은 색인의 외래 키? (오라클)

트리거를 만들지 않고 이러한 제약 조건을 만드는 방법이 있습니까?

편집 : 테이블 B 구조를 변경할 수 없습니다.

+0

SQL 표준이 아닙니다 ... 외래 키가 기본 테이블이나 상위 테이블의 고유 키를 참조하여 고유 한 레코드를 가리켜 야합니다 ... –

+1

모델에 테이블이 누락 된 것 같습니다 기본 키가이 열이 될 테이블) –

답변

3

하나의 기법은 참조 된 열의 고유 한 값을 저장하기 위해 구체화 된보기 (커밋시 빠른 새로 고침)를 사용하고 이에 대해 테이블을 제한하는 것입니다.

트리거를 사용하여 무결성을 유지하려는 시도는 일반적으로 읽기 일관성 또는 잠금 문제로 인해 발생합니다.

0

나는 이러한 관계를 실행하는 유일한 방법은 방아쇠를 사용하는 것이라고 확신합니다.

언급 한 것처럼 표 B의 데이터는 고유하지 않으므로 외래 키가 작동하지 않습니다.

점검 제한 조건이 마음에 와서 (또한 Can a foreign key reference a non-unique index? 참조), 그러나 때문에 여기에 작동하지 않습니다

  1. 하위 쿼리를 포함 할 수 없습니다 다른 테이블
  2. 를 참조하지 않아야합니다. 상기되는 그게

, 테이블 B에서 데이터가 고유하지 않은 이유는 정규화 아니라는 것을인지 할 수있다. 중간 테이블을 사용하여 A와 B 사이의 고유 한 관계를 추출 할 수 있는지 확인하기 위해 스키마를 검토 할 필요가 있습니다.

4

외래 키는 1 : N 관계입니다. 제한 조건의 참조 된 끝에는 하나의 상위 레코드 만있을 수 있습니다. 그래서 고유 키를 참조하는 외래 키 제약 조건 만 만들 수 있습니다.

M : N이라는 제약 조건이 필요합니다. 이것은 관계형 모델에 적합하지 않습니다. 아마도 테이블 A의 많은 레코드와 테이블 B의 많은 레코드를 연결하는 교차 테이블 (AB)이 필요할 것입니다. 실제로 실제 요구 사항에 따라 여러 모델링 솔루션이있을 수 있습니다.

트리거는 작동하지 않을 수 있습니다. 부분적으로는 규모가 아니지만 주로 다중 사용자 환경에서 작동하지 않기 때문입니다.

+0

답장을 보내 주셔서 감사합니다. 나는 테이블 B 구조를 변경할 수 없다는 설명을 덧붙였다. –

관련 문제