2010-11-25 119 views
1

我是mysql的新手。我知道這是一個非常基本的問題,但我無法弄清楚如何:( 我的初步嘗試:?如何使用另一個表格的列創建表格?

CREATE TABLE Node( 
    Id INT(3), 
    Position VARCHAR(12), 
    FoodTax INT(2), 
    HasTreasureMap TINYINT(1), 
    CurrentPlayer Player, 
    PRIMARY KEY(Id) 
); 

在這種情況下,「閒」是我想補充另一個表哪能這樣做嗎?

回答

2

你不能在表內添加表,你要做的是添加一個外鍵引用,它基本上是另一個表的ID(或者其他表中的任何一個),並且使另一個表分開。

CREATE TABLE Node ( 
    Id INT(3), 
    Position VARCHAR(12), 
    FoodTax INT(2), 
    HasTreasureMap TINYINT(1), 
    CurrentPlayer INT(3), 
    PRIMARY KEY(Id), 
    INDEX (CurrentPlayer) 
); 

CREATE TABLE Player (
    Id INT(3), 
    Name VARCHAR(64), 
    PRIMARY KEY (Id) 
); 

請注意,INDEX(CurrentPlayer)在除非要加入表格,否則第一個表格不是必需的,或者使用CurrentPlayer字段進行搜索或排序。

如果您使用的是InnoDB數據庫引擎,那麼您可以直接指定Node表定義內表之間關係的性質,如下所示。

CREATE TABLE Node ( 
    Id INT(3), 
    Position VARCHAR(12), 
    FoodTax INT(2), 
    HasTreasureMap TINYINT(1), 
    CurrentPlayer INT(3), 
    PRIMARY KEY(Id), 
    INDEX (CurrentPlayer), 
    FOREIGN KEY (CurrentPlayer) REFERENCES Player(Id) 
    ON UPDATE CASCADE 
    ON DELETE SET NULL 
); 

FOREIGN KEY添加導致一些影響,它增加了一個檢查,讓你不能在Node表不已經Player表存在CurrentPlayer設置一個值,任何INSERT/UPDATE嘗試此會失敗。另外,ON UPDATEON DELETE這兩個選項會告訴數據庫,如果Player中的記錄被更新或刪除,則通過Node表上的觸發器自動執行操作。 ON UPDATE CASCADE表示如果Player記錄的Id更新爲其他內容,則將級聯進入Node表,並更改該值。 ON DELETE SET NULL指出如果從Player表中刪除記錄,則Node中對應的CurrentPlayer值應設置爲NULL

+0

嗨Orbling,感謝您的回覆。我有400個節點,但我只有4名球員。那麼將Player添加爲外鍵是否有意義?這是一個遊戲地圖,我想檢查當前節點中是否有玩家。我正在考慮將它保存在我的java代碼中,但只是想試試用mysql。 – Chan 2010-11-25 19:07:33

+2

您需要SQL和數據庫設計的基礎課程。一些實際的信息可以在這裏找到:http://www.kawoolutions.com/SQL_Database_Design – Kawu 2010-11-25 19:20:44

0

您的表看起來是這樣的

NODE ID POSITION食品-TAX TREASUREMAP PLAYER

PLAYER

ID_PLAYER NAME_PLAYER

SO節點玩家只是外鍵YOUR播放器表的主鍵ID_PLAYER。

決定每個節點中是否總是有玩家,或者它可以爲空。

決定是否要將表引擎搜索爲InnoDb或MyIsam。你的選擇將取決於它是否會比更新或其他方式更受質疑。如果主要被查詢,選擇MyIsam會更快。但是在這種情況下,請知道MyIsam不支持外鍵,但是您可以通過創建索引並通過該參數進行連接來打敗它。對不起,如果我給你太多的信息,但這些是你無論如何都會遇到的事情。

有一個愉快的一天

相關問題