php - 错误 (150) - 设计基本关系数据库时遇到问题

标签 php mysql database-design relational-database

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

我正在开发一个数据库,它将成为我用 PHP 编写的基本统计系统的基础。我得出结论,我将需要(至少)3 个表。

TOURNAMENT -> 一场比赛有多场比赛

tournamentID SMALLINT UNSIGNED PRIMARY KEY, 

MATCH -> 一场比赛有很多玩家

tournamentID SMALLINT UNSIGNED,
matchID SMALLINT UNSIGNED,

玩家 -> 一个玩家有很多场比赛和很多锦标赛

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,我认为这与 PLAYERS 表中的主键/外键引用有关:

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

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

请帮忙。

最佳答案

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

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

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

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

关于php - 错误 (150) - 设计基本关系数据库时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12800725/

相关文章:

php - Paypal 的 token ID 唯一?

python - Django在另一个不存在的表中按键排序

database - 表中单个属性的解决方案

database-design - OO 数据模型 - 我可以忽略对象关系映射器约束吗?

php - 使用 php 到 Android 无法从 MySql 获取数据?

php - 使用 Paypal In-Context 进行 Paypal Express Checkout 的一个小问题

Mysql 平均时间列?

php - mysql - 查明输入是否存在于最后 30 条记录中

数据库 - 软删除或分离的日志表

php - 使用 PHP 查看域是否正在使用或注册的快速方法