2012-10-09 43 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

这不太有用,是不是?尝试创建球员表_without_在tournamentID/matchID上定义的主键。通常,err150涉及FK列与其引用的键之间的数据类型不匹配。 –

回答

1

除非有人在上面评论表格定义的任何问题,你得到错误150的原因是因为Players(显然是有问题的表格)无法创建,因为它不能使用matchID作为外键。为什么?因为您只能使用在另一个表上使用的外键。

PRIMARY KEY (one, two)确实从这两列中生成一个唯一的主键,但只有one将被视为一个关键。

您可以通过添加这Matches轻松解决这个问题:

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

这确实在技术上解决了我的问题,所以我想这是我寻找的答案!另一方面,我现在意识到我可能需要重新考虑表格设计。尽管如此。 – anditpainsme

+0

@anditpainsme至少你会知道如何处理你的未来设计这个错误。 –