2010-11-25 123 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不支持外键,但是您可以通过创建索引并通过该参数进行连接来打败它。对不起,如果我给你太多的信息,但这些是你无论如何都会遇到的事情。

有一个愉快的一天

相关问题