1

PHP で作業している小さなプロジェクトのデータベースを設計しようとしています。私はデータベースを扱った経験があまりないので (すぐに気付くと思いますが)、今は少し深みにはまってしまいました。

PHP で作成している基本的な統計システムの基盤となるデータベースを開発しています。(少なくとも) 3 つのテーブルが必要であるという結論に達しました。

TOURNAMENT- > 1 つのトーナメントで多くの試合が行われる

tournamentID SMALLINT UNSIGNED PRIMARY KEY, 

MATCH-> 1 つの試合に多数のプレイヤーが参加

tournamentID SMALLINT UNSIGNED,
matchID SMALLINT UNSIGNED,

PLAYER-> 1 人のプレーヤーが多くの試合と多くのトーナメントを行う

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)

私はいくつかの読書を行い、以前の質問をいくつか見ましたが、そもそも実際の問題 (エラーが発生している理由) を本当に理解していません。データベースの設計が間違っていることは明らかですが、データベースを改善および修正する方法がわかりません。

助けてください。

4

1 に答える 1

1

上記で人々がコメントしているテーブル定義の問題を除けば、エラー 150 が発生する理由は、外部キーとしてPlayers使用できないため (明らかに問題のあるテーブル) を作成できないためです。matchIDなんで?他のテーブルのキーである外部キーしか使用できないためです。

PRIMARY KEY (one, two)は、これら 2 つの列から一意の主キーを作成しますoneが、単独でキーと見なされるだけです。

これを に追加することで、これを簡単に修正できますMatches

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