2012-10-09 45 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至少你會知道如何處理你的未來設計這個錯誤。 –