1

我正在尝试为我正在使用 PHP 进行的一个小项目设计一个数据库。我没有太多使用数据库的经验(你很快就会注意到),所以现在我已经把自己投入了一点点。

我正在开发一个数据库,它将成为我用 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 脚本时,我收到 err 150,我认为这与我在 PLAYERS 表中的主键/外键引用有关:

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

我已经阅读并查看了之前的一些问题,但我并没有真正理解实际问题(发生错误的原因)。显然我的数据库设计不正确,但我不确定我应该如何改进和修复它。

请帮忙。

4

1 回答 1

1

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

PRIMARY KEY (one, two)确实从这两列中创建了一个唯一的主键,但只会one将其视为一个键。

您可以通过将其添加到以下内容来轻松解决此问题Matches

...
PRIMARY KEY (tournamentID, matchID),
KEY (matchID),
...
于 2012-10-09T13:46:25.750 回答