2012-07-03 4 views
1

여러 개의 외래 키 관계가있는 일련의 테이블을 만들려고합니다. 두 테이블 중 첫 번째 테이블은 우리가 지정하고 제조사가 지정한 다른 두 개의 기본 키를 가지고 있습니다. 세 번째 쿼리를 시도 할 때 오류가 발생하고 있습니다. 나는 무엇이 잘못되었는지 잘 모르므로 어떤 도움도 진심으로 감사 할 것입니다.MySQL 오류 150 (외래 키 문제?)

SQL은

CREATE TABLE rugs (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    manufacturer_id INTEGER NOT NULL, 
    name VARCHAR(255), 
    description TEXT, 
    PRIMARY KEY (id, manufacturer_id) 
); 

CREATE TABLE carpets (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    manufacturer_id INTEGER NOT NULL, 
    name VARCHAR(255), 
    warranty TEXT, 
    description TEXT, 
    fiber_name VARCHAR(255), 
    brand_name VARCHAR(255), 
    texture_name VARCHAR(255), 
    PRIMARY KEY (id, manufacturer_id) 
); 

CREATE TABLE carpet_styles (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    carpet_id INTEGER, 
    style_name VARCHAR(255), 
    PRIMARY KEY (id), 
    FOREIGN KEY (carpet_id) REFERENCES carpets (manufacturer_id) 
); 

CREATE TABLE carpet_colors (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    carpet_id INTEGER, 
    color_name VARCHAR(255), 
    color_category VARCHAR(255), 
    PRIMARY KEY (id), 
    FOREIGN KEY (carpet_id) REFERENCES carpets (manufacturer_id) 
); 

CREATE TABLE carpet_custom_names (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    carpet_id INTEGER, 
    custom_name VARCHAR(255), 
    PRIMARY KEY (id), 
    FOREIGN KEY (carpet_id) REFERENCES carpets (manufacturer_id) 
); 

CREATE TABLE rug_styles (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    rug_id INTEGER, 
    style_name VARCHAR(255), 
    PRIMARY KEY (id), 
    FOREIGN KEY (rug_id) REFERENCES rugs (manufacturer_id) 
); 

CREATE TABLE rug_colors (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    rug_id INTEGER, 
    color_name VARCHAR(255), 
    color_category VARCHAR(255), 
    PRIMARY KEY (id), 
    FOREIGN KEY (rug_id) REFERENCES rugs (manufacturer_id) 
); 

CREATE TABLE rug_shapes (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    rug_id INTEGER, 
    shape_name VARCHAR(255), 
    shape_category VARCHAR(255), 
    PRIMARY KEY (id), 
    FOREIGN KEY (rug_id) REFERENCES rugs (manufacturer_id) 
); 

CREATE TABLE catalog_contents (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    catalog_id INTEGER, 
    carpet_id INTEGER, 
    rug_id INTEGER, 
    PRIMARY KEY (id), 
    FOREIGN KEY (rug_id) REFERENCES rugs (id), 
    FOREIGN KEY (carpet_id) REFERENCES carpets (id), 
    FOREIGN KEY (catalog_id) REFERENCES catalogs (id) 
); 
+0

'쇼 이노 디비 status' 마찬가지입니다, 정확히 원인을 무엇의 자세한 내용과 더불어, '마지막 외래 키 오류'섹션 될 것입니다 모두의 중간에 150 코드. –

+0

불행히도 이것은 더 이상 최신 버전의 mysql (더 이상 stackoverflow.com에 질문을 게시하기 전에 시도한 것을 의미)이 아닙니다. – bulletshot60

답변

2

이는 carpets.manufacturer_id 복합 키의 일부이지만, 그것의 자신의 인덱스가없는 사실로 나타납니다. 복합체 PRIMARY KEY과는 별도로 색인을 작성해야합니다. 동일은 정보의 톤 덤프 rugs.manufacturer_id

CREATE TABLE rugs (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    manufacturer_id INTEGER NOT NULL, 
    name VARCHAR(255), 
    description TEXT, 
    /* manufacturer_id gets its own index */ 
    PRIMARY KEY (id, manufacturer_id), 
    INDEX idx_rugs_manufacturer_id (manufacturer_id) 
); 


CREATE TABLE carpets (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    manufacturer_id INTEGER NOT NULL, 
    name VARCHAR(255), 
    warranty TEXT, 
    description TEXT, 
    fiber_name VARCHAR(255), 
    brand_name VARCHAR(255), 
    texture_name VARCHAR(255), 
    PRIMARY KEY (id, manufacturer_id), 
    /* manufacturer_id gets its own index */ 
    INDEX idx_manufacturer_id (manufacturer_id) 
); 
+1

고정 된 수수께끼 : http://sqlfiddle.com/#!2/111c6 – biziclop

+0

@biziclop 이렇게 스키마는 manufacturer_id에 대한 KEY/INDEX를 생성 한 후에 올바르게 생성 된 것처럼 보입니다. –

+0

네, 몇 가지를 추가하고 생략 된'catalogs' 테이블에 대한 언급을 주석 처리했습니다. – biziclop