2011-12-04 2 views
1

SQL에서 기본 키가 아닌 (여러) 고유 키 인 외래 키를 가질 수 있습니까? 구체적으로 :SQL은 외래 키가 다중 후보 키인 경우이를 허용하지 않습니까?

[표 1]

CREATE TABLE Session_Record(
c_id CHAR (3) NOT NULL 
    REFERENCES Club_Record(c_id), 
sess_id NUMBER (4) NOT NULL CHECK (sess_id >0) 
room CHAR (4) NOT NULL, 
UNIQUE(c_id, sess_id) 
); 

[표 2]

CREATE TABLE SessionDuration__Record(
c_id CHAR (3) NOT NULL 
    REFERENCES Club_Record(c_id), 
sess_id NUMBER (4) NOT NULL CHECK (sess_id >0) 
    REFERENCES Session_Record(sess_id), 
day CHAR(9) NOT NULL, 
duration NUMBER(3) NOT NULL, 
UNIQUE(c_id, sess_id) 
); 

'C_ID'Club_Record 테이블의 기본 키이다. 그러나 sess_id는 기본 키가 아닙니다. c_id와 조합 된 다중 후보 키입니다. 이 선언 형식은 SQL에서 허용됩니까? Oracle 10g는 (sess_id) 외래 키 문에 대해 "이 열 목록에 일치하는 고유 키 또는 기본 키가 없습니다"를 반환하기 때문에. 도움을 많이 받으실 수 있습니다!

답변

2

당신의 SQL은 몇 가지 다른 방법으로 무효 (Session_Record.sess_id의 정의 뒤에 쉼표 누락, 그것을 인용하지 않고 식별자로 day 사용),하지만 당신은 명시 적으로 약 — 내가 추측하고있어 묻는 문제 만 고집하는 것 당신이 정말로 원하는 이것이다 :

입니다
CREATE TABLE SessionDuration__Record 
(
    c_id  CHAR(3) NOT NULL REFERENCES Club_Record(c_id), 
    sess_id NUMBER(4) NOT NULL CHECK (sess_id >0), 
    "DAY"  CHAR(9) NOT NULL, 
    duration NUMBER(3) NOT NULL, 
    UNIQUE(c_id, sess_id), 
    FOREIGN KEY (c_id, sess_id) REFERENCES Session_Record(c_id, sess_id) 
); 

, 당신은 각 (SessionDuration__Record.c_id, SessionDuration__Record.sess_id)가 존재 (Session_Record.c_id, Session_Record.sess_id)에 해당하는지 확인되고 싶어요.

+0

아 봤어! 그 일을 해 주셔서 감사합니다, 그냥 SQL에서 시작하기 :) – Abhischek

+0

당신을 진심으로 환영합니다! – ruakh

+0

화합물'(c_id, sess_id)'에 대한 참조는 간단한 '(c_id)'참조를 중복시킵니다. – onedaywhen

2

정확하게 메시지의 내용입니다. SessionDuration__Record의 "sess_id"는 Session_Record의 동일한 명명 된 열을 참조하는 외래 키가 될 수 없으므로 해당 열은 고유하지 않습니다.

예를 들어, Session_Record에 두 개의 다른 레코드가 있지만 sess_id 값이 같으면 SessionDuration__Record는 두 레코드 중 어느 레코드를 참조 할 지 알 길이 없습니다.

관련 문제