2014-10-10 2 views
1

다음은 데이터베이스를 설정하는 데 사용하려는 내 sql 스크립트입니다. 기본적으로 테스트/설문 조사와 같은 선택을하는 사람들이 있습니다. 각 개인 (사람 테이블)에 대한 정보와 각 질문 (질문 테이블)에 대한 답변이 있습니다. 질문에 대한 기본 키가 (id, qid)입니다.외래 키 오류를 생성하는 MySQL 150

여기 내 문제가 있습니다. 각 질문과 관련된 정수 배열을 저장하고 싶습니다. 그래서 세 번째 테이블, 배열, 누구의 기본 키는 (id, qid, idx)입니다 idx 배열의 값을 인덱스입니다 .ID 및 qid 모두 해당 질문을 테이블에 해당 항목이 있어야합니다, 그래서 이러한 외래 키를 만들었지 만 일반적인 150 errno 내가 이렇게. 내가 확실하지 않다 왜.

CREATE TABLE person (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    age INT, 
    income INT 
); 

CREATE TABLE questions (
    id INT NOT NULL, 
    qid INT NOT NULL, 
    a INT, 
    b INT, 
    c INT, 
    PRIMARY KEY (id, qid), 
    FOREIGN KEY (id) REFERENCES person(id) 
); 

CREATE TABLE array (
    id INT NOT NULL, 
    qid INT NOT NULL, 
    idx INT NOT NULL, 
    array_value INT NOT NULL, 
    PRIMARY KEY (id, qid, idx), 
    FOREIGN KEY (id) REFERENCES person(id), 
    FOREIGN KEY (qid) REFERENCES questions(qid) 
); 

이 스크립트는 작동하지 않습니다. 당신이 QID에 대한 외래 키를 설정하려고 맨 마지막 줄을 제거하면 스크립트가 실행됩니다 withou t 오류.

이 외래 키를 만들 때 발생하는 오류는 무엇입니까?

답변

1

빠른 수정 외래 키 제약 조건이 questions 테이블의 기본 키를 참조하는 것을 변경하는 것입니다. 기본 키는 두 개의 컬럼의 조합으로 정의되어 있기 때문에, 외부 키는 동일해야합니다

FOREIGN KEY (id,qid) REFERENCES questions(id,qid) 
당신이 가지고있는 구문

, 오류가 questions 테이블이없는 때문에 선도 색인으로 qid를 가진 색인. questions에 이러한 색인을 추가 한 경우 qid 열을 참조하는 외래 키를 만들 수 있습니다. InnoDB는 고유하지 않은 키가 외래 키에 의해 참조 될 수있게 해주지 만, 그렇게하고 싶지는 않습니다. 그건 비표준 확장입니다. 그리고 문서는 그것을 경고합니다.

정상적인 패턴은 외래 키의 대상으로 PRIMARY KEY (또는 UNIQUE KEY)를 갖는 것입니다. 위의 외래 키 정의가 위의 패턴과 같습니다.


후속

귀하의 모델은 잘 보인다.

개인적으로 선호하는 것은 단일 열을 question 테이블의 기본 키로 사용하는 것입니다. (나는 또한 개발자들이 클래스의 이름을하려고하는 것과 일치하는, 단수에있는 모든 테이블의 이름을 지정합니다.)

person 
    id (PK) 

question 
    id (PK) 
    person_id (FK references person.id) 
나는 이름없는 것이다

세 번째 테이블 "배열", 나는 그것을 다른 이름을 줄 거라고 . 그 정수 값의 "하나"가 나타내는대로 이름을 짓 겠지만, 정수 값이 실제로 무엇인지는 분명하지 않습니다.

score 
    id (PK) 
    question_id (FK references question.id) 
    idx 
    score_value 

그 모델은 내 개인 취향에 맞습니다. 당신이 가지고있는 것은 확실히 실행 가능합니다.

+0

+1 from me ...... –

+0

고마워, 그게 내가하고 싶은 일 이었어. 당신의 대답은 제가하는 일이 제 상황을 다루는 적절한 방법이 아니라는 인상을줍니다. 내가하려는 일을하는 더 좋은 방법이 있습니까? (즉, 배열을 테이블의 모든 레코드와 연관시킵니다.) –

+0

나에게있어 보이는 것은 괜찮습니다. 내 개인적인 취향은 질문 표의 기본 키로 단일 열을 갖는 것입니다. 하지만 그것은 개발자가 DAO에 일관된 패턴을 원하고 단일 값, 원시 데이터 유형을 원한다는 것을 알려줍니다. 식별자로 두 멤버가있는 Object (Class)의 추가 복잡성을 원하지 않습니다. – spencer7593

1

questionsqid 열에는 유일성이 보장되지 않습니다. 이는 외래 키의 대상 키 의 요구 사항입니다. 따라서 대상은 기본 키이거나 고유 제한 조건입니다.

는 아마도 찾으 셨나요?

FOREIGN KEY (id, qid) REFERENCES person(id, qid) 
+0

오, 고마워. 이 경우, 현재의 케이스처럼 표준 처리 방법은 무엇입니까? 질문에 arrayid 필드를 도입하면 고유 할 것이고 배열 테이블은 qid 대신 arrayid를 참조하게됩니까? –