2012-10-09 2 views
1

PHP에서 작업중인 작은 프로젝트 용 데이터베이스를 설계하려고합니다. 데이터베이스 작업에 많은 경험이 없으므로 (곧 알게 될 것입니다.) 지금 당장은 깊은 곳에서 자신을 조금 던져 봤습니다.err (150) - 기본 관계형 데이터베이스 설계시 문제가 있습니다

저는 PHP로 작성한 기본 통계 시스템의 기초가 될 데이터베이스를 개발 중입니다. 나는 (적어도) 3 개의 테이블이 필요할 것이라고 결론을 내렸다.

TOURNAMENT ->한 대회는 많은 경기

tournamentID SMALLINT UNSIGNED PRIMARY KEY, 

MATCH있다 ->하나의 일치는 많은 선수있다

tournamentID SMALLINT UNSIGNED, 
matchID SMALLINT UNSIGNED, 

PLAYER ->한 플레이어는 많은 경기와 많은 경기 대회가 있습니다

tournamentID SMALLINT UNSIGNED, 
matchID SMALLINT UNSIGNED, 
playerID SMALLINT UNSIGNED, 

이 데이터베이스를 생성 할 내 시도 :

<?php 
//Connect 
$link = mysql_connect("localhost", "root", "password") or die(mysql_error()); 
mysql_select_db("stats") or die(mysql_error()); 

//Drop old tables 
mysql_query('DROP TABLE PLAYERS'); 
mysql_query('DROP TABLE MATCHES'); 
mysql_query('DROP TABLE TOURNAMENT'); 
echo('Old tables dropped<br \>'); 

//Create new tables 

// TOURNAMENT 
mysql_query('CREATE TABLE TOURNAMENT(
tournamentID SMALLINT UNSIGNED PRIMARY KEY, 
)') or die(mysql_error()); 
echo('TOURNAMENT created...<br />'); 

// MATCHES 
mysql_query('CREATE TABLE MATCHES(
    tournamentID SMALLINT UNSIGNED, 
    matchID SMALLINT UNSIGNED, 

    PRIMARY KEY (tournamentID, matchID), 
    FOREIGN KEY (tournamentID) REFERENCES TOURNAMENT(tournamentID) 
)') or die(mysql_error()); 
echo('MATCH created...<br />'); 

// PLAYERS 
mysql_query('CREATE TABLE PLAYERS(
    tournamentID SMALLINT UNSIGNED, 
    matchID SMALLINT UNSIGNED, 
    playerID SMALLINT UNSIGNED, 

    PRIMARY KEY (tournamentID, matchID), 
    FOREIGN KEY (tournamentID) REFERENCES TOURNAMENT(tournamentID), 
    FOREIGN KEY (matchID) REFERENCES MATCHES(matchID) 
)') or die(mysql_error()); 
echo('PLAYERS created...<br />'); 

echo('Blank tables created'); 

mysql_close(); 

내가받는 PHP 스크립트는 내 기본 키/플레이어 테이블의 외래 키 참조를 함께 할 수있는 뭔가가 생각 (150), 잘못 실행하면 :

Old tables dropped 
TOURNAMENT created... 
MATCH created... 
Can't create table 'stats.players' (errno: 150) 

좀 읽기를 수행하고 일부 이전 질문 보았다하지만 난 정말 처음부터 실제 문제 (이유는 오류가 발생한) 이해하지 못하고있다. 분명히 내 데이터베이스의 디자인은 정확하지 않지만 어떻게 개선하고 수정해야하는지 잘 모르겠습니다.

도와주세요.

+0

당신이받을 정확한 오류가 무엇입니까? –

+0

'stats.players'테이블을 만들 수 없습니다. (errno : 150) – anditpainsme

+0

그게 너무 도움이되지 않습니까? tournamentID/matchID에 정의 된 기본 키를 사용하지 않고 플레이어 테이블을 만들려고합니다. 일반적으로 err150은 FK 열과 참조하는 키 사이의 데이터 형식 불일치와 관련이 있습니다. –

답변

1

사람들이 위에 언급 한 테이블 정의의 문제를 제외하면 matchID을 사용할 수 없기 때문에 Players (분명히 문제가있는 테이블)을 만들 수 없으므로 150이라는 오류가 발생합니다. 외래 키. 왜? 다른 테이블의 키인 외래 키만 사용할 수 있기 때문입니다.

이 두 열의 고유 한 기본 키를 만들지 만 one만의 키로 간주됩니다.

당신은 Matches이를 추가하여 쉽게이 문제를 해결할 수 있습니다

... 
PRIMARY KEY (tournamentID, matchID), 
KEY (matchID), 
... 
+0

이것은 기술적으로 내 문제를 해결하므로 찾고 있던 대답이라고 생각합니다! 다른 한편으로, 나는 이제 테이블을 다시 생각할 필요가 있음을 깨닫는다. 그럼에도 불구하고 고마워. – anditpainsme

+0

@anditpainsme 적어도 향후 디자인에서이 오류를 처리하는 방법을 알게 될 것입니다. –

관련 문제