2011-02-16 2 views
10

내가 다른 테이블의 동일한 열을 가리 키도록 테이블의 두 컬럼에 외래 키를 만들려고 해요,하지만 난 오류가 발생하는 것에 외래 키 추가</p> 다음 <p>무엇을의 ... 여러 열

CREATE TABLE test2 (
    ID INT NOT NULL AUTO_INCREMENT, 
    col1 INT NOT NULL, 
    col2 INT NOT NULL, 
    PRIMARY KEY (ID), 
    CONSTRAINT fk FOREIGN KEY (col1, col2) 
       REFERENCES test1(ID, ID) 
    ON UPDATE CASCADE 
    ON DELETE RESTRICT 
) ENGINE=InnoDB; 

하지만 하나 개의 컬럼 만, 그러나, 테이블이 제대로 생성이 있다면 나는

ERROR 1005 (HY000): Can't create table 'DB.test2' (errno: 150)

를 얻을 : 내가 할.

누군가가 오류가있는 곳을 알려줄 수 있습니까?

감사 N

+0

test1의 DDL은 무엇입니까? – Chandu

+0

@Cybernate : 죄송합니다, 지정하는 것을 잊어 버렸습니다. ID는 test1의 기본 키이며 col1 및 col2 (INT)와 동일한 유형입니다. 다른 열 (그러나 그것은 중요하지 않아야 함)이 있으며 다른 제약 조건이나 인덱스는 설정되지 않습니다. – nico

+0

계단식 업데이트 또는 삭제를 지정하지 않고이 기능을 사용해 보셨습니까? – Thomas

답변

8

여기를 시도하고 같은 오류가 발생했습니다. 이것은 비록 작동합니다

CREATE TABLE test2 (
    ID INT NOT NULL AUTO_INCREMENT, 
    col1 INT NOT NULL, 
    col2 INT NOT NULL, 
    PRIMARY KEY (ID), 
    CONSTRAINT fk FOREIGN KEY (col1) 
       REFERENCES test1(ID) 
    ON UPDATE CASCADE 
    ON DELETE RESTRICT, 
    CONSTRAINT fk2 FOREIGN KEY (col2) 
       REFERENCES test1(ID) 
    ON UPDATE CASCADE 
    ON DELETE RESTRICT 

) ENGINE=InnoDB 

예, 나는 알고있다 - 스크립트 한다 일 (심지어 훨씬 이해하지 못하는 경우). 그러나, 나는이 새로운 버전이 더 나은 것 같아.

+0

글쎄요, 잘 작동합니다. 왜 광산이 아니라고는하지만, 어쨌든 ... – nico

+4

@nico - 동일한 부모 테이블 열에 대해 두 개의 독립적 인 관계가 있기 때문에 작동합니다. 부모 테이블 키가 다중 컬럼 키인 경우에만 원래 게시물에있는 구문을 사용하면됩니다. s 위 테이블 컬럼이 단일 컬럼 인 경우, s 위 테이블 컬럼을 참조하려는 각 하위 컬럼에 대해 별도의 외부 키 제한 조건을 작성해야합니다. – Thomas

+0

@ 토마스 : 좋아, 이제 알 겠어! 실제로 그것에 대해 생각할 때, 그것은 많은 의미를가집니다. 고맙습니다. – nico

2

동일한 외래 키 (즉, (ID, ID))에서 동일한 상위 열을 두 번 지정하는 것으로 문제가 발생할 수 있습니다. 다음은 작동합니다 :

Create Table Test1 
    (
    PK1 int not null 
    , PK2 int not null 
    , Primary Key (PK1, PK2) 
    ) 

Create Table Test2 
    (
    Id int not null Auto_Increment 
    , PK1 int not null 
    , PK2 int not null 
    , Primary Key (ID) 
    , Constraint FK_Test2 
     Foreign Key (PK1, PK2) 
     References Test1(PK1, PK2) 
    ) 

는 경우라면, rsenna 같이 그 두 가지를 대표로 같은 부모 테이블 열, 당신은 두 개의 외래 키 참조를 추가해야합니다을 참조하는 자식 테이블에서 두 개의 열이 원하는 독립적 인 관계.

+0

글쎄,하지만 Test1에 복합 기본 키가 없습니다 ... Test2의 두 열은 Test1의 동일한 (고유 한) 기본 키를 가리켜 야합니다. – nico

+0

@nico - 그러면 두 개의 독립적 인 관계를 나타내며 두 ​​개의 외래 키 제약 조건을 필요로합니다. 상위 열이 다중 열 키인 경우에만 OP에서 사용하는 구문을 사용합니다. – Thomas