2012-03-25 2 views
4

나는 두 테이블두 테이블이 서로를 참조합니다 : Oracle 데이터베이스에 행을 삽입하는 방법?

Department는 속성이 ProfessorProfessor는 속성이 Department 이들이

를 참조 DeptID라는이 참조 HeadID라는 가지고있는

  1. Department
  2. Professor

이 순환 관계.

하지만 문제는 이러한 테이블에 행을 삽입하는 방법입니다.

오라클은 행을 삽입 한 후 "상위 키를 찾을 수 없음"이라고 불평했습니다.

+0

경우에서 만든 그의 새로운 부서를 참조하는 1 단계에서 교수 기록을 갱신 머리

  • 로 1 단계에서 교수는'부서의 headid' 홍보 후, 널 (null) ,, 처음 삽입 부서 일 수도 있습니다 교수님, 그러면 부서를 업데이트하십시오 ... – Aprillion

  • +0

    '부서'의 '부서장'과 '교수'의 부서장 ID 번호가 'NOT NULL'입니다. – sc1013

    +1

    어 .. 새 부서에 이미 기존 교수를 사용하고 대체 할 수 있습니다. 그것들은 .. – Aprillion

    답변

    11

    외래 키 제약 조건 중 하나를 DEFERRABLE로 정의하고 트랜잭션이 끝날 때까지 제약 조건 검사를 연기 할 수 있습니다 of "parent key not found"로 끝나는 구문). 읽기 here

    +0

    그 디자인이 정말로 필요한 경우 연기 가능한 제약이 갈 방법입니다. (아마도 두 제약을 연기 할 수 있습니다.) –

    0

    여러 열로 구성된 외래 키로 인해 열 중 하나가 SQL-92 표준에 따라 참조 된 열에 일치하는 값이없는 값을 포함 할 수 있습니다. 이러한 상황을 방지하기 위해, 외부 키의 모든 컬럼에 NOT NULL 제약 조건을 만들

    그래서

    for reference

    난 당신이 외래 키 열에 값을주지 않고 행 중 하나에 데이터를 삽입 한 후 두 번째로 행 삽입 할 수 있습니다 생각 첫 번째 테이블에서 기본 키의 행 참조 값을 입력 한 후 계속 진행할 수 있습니다.

    1

    여기에 설명 된 다른 해결책은 더 간단합니다.
    그러나 실제로 DB가 귀하의 비즈니스 (반드시 최상의 접근 방법은 아님)를 설명하려면 다른 테이블을 가질 수 있습니다 (DEPT_HEAD_POSITIONS). Department 테이블에는이 테이블을 참조하는 FK (HeadID)가 있고 Professor 테이블에는이 새 테이블에 대한 FK로 다른 Nullable 필드가 있습니다.

    이제, 당신이 무슨이다 :

    • 부서는
    • 부서는 부서에 속해 있어야하고 의 머리 수 있습니다
    • 교수 ((즉, 머리 위치가 있어야합니다) 위치를 머리 부서)
    -1

    오라클과 SQL Server는 행을 삭제할 때 항상 문제가 있기 때문에 순환 참조를 허용하지 않습니다. ..... 삭제 될 행을 참조하는 다른 테이블 (외부 키)의 다른 행에 대한 종속성이있는 테이블 .....

    +0

    오라클의 경우는 그렇지 않습니다. 제약 조건을 연기 가능한 것으로 정의 할 수 있습니다 (Marcin의 대답 참조). –

    0

    스키마를 재 설계 할 권한이있는 경우, 다음을 수행하십시오. 그렇지 않다면 나는 죽음에 대한 가장 단순하고 최선의 접근 방식이 4 월호에 설명되어 있다고 생각한다.학과와 추가 다른 부서

  • 에서 교수를 추가

    1. : 새 부서를 이끌고 새로운 교수를 추가 할 사용하는 경우

      , 당신의 최선이야 2 단계
  • 관련 문제