2013-07-03 4 views
2

나는 고객/프로젝트를 위해 수행 한 모든 설계/작업을 카탈로그 화하기 위해 온라인 포트폴리오 웹 사이트 용 MySQL 데이터베이스를 작성하고 있으며이를 수행하는 대신 새 작업을 추가하는 것이 더 쉽습니다. 수동으로 마크 업을 편집 할 수 있습니다.MySQL 1005 오류

어쨌든, 아래의 스크립트를 실행 시도 :

create table album (
    AlbumID int not null, 
    AlbumOrder int not null, 
    AlbumName varchar(100), 
    primary key (AlbumID, AlbumOrder) 
); 

create table category (
    CategoryID int not null primary key auto_increment, 
    CategoryName varchar(100) 
); 

create table item (
    ItemID int not null primary key auto_increment, 
    CategoryID int not null, 
    AlbumID int not null, 
    AlbumOrder int not null, 
    ItemName varchar(100), 
    Description varchar(500), 
    ThumbPath varchar(100), 
    PhotoPath varchar(100), 
    InsertDate datetime, 
    EditDate datetime, 
    constraint fk_catID foreign key (CategoryID) references category (CategoryID) on update cascade, 
    constraint fk_albID foreign key (AlbumID) references album (AlbumID) on update cascade, 
    constraint fk_albOrd foreign key (AlbumOrder) references album (AlbumOrder) on update cascade 
); 

나는 아이템 테이블이 생성 될 수 없다는 1005 오류가 발생합니다. 문제가 어디에서 발생했는지는 알 수 없지만 정말 확실합니다.

EDIT : 엔진이 innoDB입니다.

+0

먼저 DB에 이미 같은 이름의 테이블이 없도록해야합니다. 다음으로는 항목 테이블을 만들기 전에 앨범 및 카테고리 테이블을 만들어야합니다. –

+0

나는 그것을 시도하고 여전히 오류를 제공합니다. –

+1

'AlbumID'는 PK가 아니므로 색인이 없습니다 (또한'AlbumOrder'). 이로 인해 http://stackoverflow.com/questions/4063141/mysql-foreign-key-error-1005-errno-150 –

답변

0

앨범을 보는 것이 문제의 원인 일 수 있습니다. SQL Fiddle

constraint fk_albID foreign key (AlbumID,AlbumOrder) references album (AlbumID,AlbumOrder) on update cascade 

이 스크립트는 오류없이 테이블을 생성 :

단일 FK 1 열 각, 너무합니다 (fk_albOrd 라인을 제거) 등을 기준으로 2 열보다는 2 FKS을 기반으로해야한다
create table album (
    AlbumID int not null, 
    AlbumOrder int not null, 
    AlbumName varchar(100), 
    primary key (AlbumID, AlbumOrder) 
); 

create table category (
    CategoryID int not null primary key auto_increment, 
    CategoryName varchar(100) 
); 

create table item (
    ItemID int not null primary key auto_increment, 
    CategoryID int not null, 
    AlbumID int not null, 
    AlbumOrder int not null, 
    ItemName varchar(100), 
    Description varchar(500), 
    ThumbPath varchar(100), 
    PhotoPath varchar(100), 
    InsertDate datetime, 
    EditDate datetime, 
    constraint fk_catID foreign key (CategoryID) references category (CategoryID) on update cascade, 
    constraint fk_albID foreign key (AlbumID,AlbumOrder) references album (AlbumID,AlbumOrder) on update cascade 

); 
+0

예, 분명 할 수도 있습니다. : –

+1

여러 개의 FK가있는 데는 아무런 문제가 없습니다.다중 열 FK와 두 개의 개별 FK 간에는 매우 큰 차이가 있습니다. 서로 다르게 동작하므로 다르게 사용해야합니다. OP가 세 개의 FK를 원한다면, MySQL에서 그가 할 수 없다는 것을 나는 알지 못한다. 내 답변에 언급했듯이, 처음 게시 된 코드는 MySQL 서버에서 오류없이 실행됩니다. –

+0

필자는 phpmyadmin에서 관계형 뷰를 살펴 보았지만이 솔루션은 필요한 관계를 생성하지 못했습니다. –

0

현재 진술에 문제가 없습니다.

방금 ​​테스트 MySQL 환경에서 성공적으로 실행했습니다. 그러나 내 환경은 당신과 다를 수 있습니다 : 나의 기본 엔진은 InnoDB이고, 당신의 것이 다른 것일 수 있습니다.

외래 키 제약 조건을 사용하고 있으므로 명시 적으로 엔진이 InnoDB ("... engine = Innodb")임을 명시해야합니다.

이미 하나 이상의 테이블이 있기 때문일 수 있습니다. 각각의 생성자를 DROP ...으로 끝내십시오. IF가 존재하면 잘 작동합니다. MySQL의 문 show engine innodb status을 실행하여

+0

나에 대한 기본 엔진은 또한 innodb이지만 나는 또한 당신의 솔루션을 시도 할 것입니다. –

+1

나는 디폴트에 의존하지 않는다. 디폴트가 변경되면, 일이 깨진다. 항상 원하는 것을 지정하는 것이 가장 좋습니다. –

+1

좋은 일반적인 규칙은 ... 명심하십시오. –

0

즉시 오류를받은 후, 오류에 대한 추가 정보를 검색 할 수 있습니다 (출력 단축) :

참조 된 테이블에서
LATEST FOREIGN KEY ERROR 

Cannot find an index in the referenced table where the 
referenced columns appear as the first columns, or column types 
in the table and the referenced table do not match for constraint. 

가, 열을 참조하는 인덱스가 있어야합니다 첫 번째 열로 나열됩니다. fk_albOrd foreign key (AlbumOrder)에는 유효하지 않습니다.

문제를 해결하기 위해, 당신은 Album 테이블이나에 열 AlbumOrder에 인덱스를 추가 할 수 있습니다 - 바람직 - fk_albOrd 제거하고 데릭 Kromm에 의해 제안 열 그룹에 fk_albID 제약 조건을 변경 얻을 :

constraint fk_albID foreign key (AlbumID, AlbumOrder) references album (AlbumID, AlbumOrder) on update cascade