我正在尝试为我正在使用 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/