你不能在表内添加表,你要做的是添加一个外键引用,它基本上是另一个表的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 UPDATE
和ON DELETE
这两个选项会告诉数据库,如果Player
中的记录被更新或删除,则通过Node
表上的触发器自动执行操作。 ON UPDATE CASCADE
表示如果Player
记录的Id
更新为其他内容,则将级联进入Node
表,并更改该值。 ON DELETE SET NULL
指出如果从Player
表中删除记录,则Node
中对应的CurrentPlayer
值应设置为NULL
。
嗨Orbling,感谢您的回复。我有400个节点,但我只有4名球员。那么将Player添加为外键是否有意义?这是一个游戏地图,我想检查当前节点中是否有玩家。我正在考虑将它保存在我的java代码中,但只是想试试用mysql。 – Chan 2010-11-25 19:07:33
您需要SQL和数据库设计的基础课程。一些实际的信息可以在这里找到:http://www.kawoolutions.com/SQL_Database_Design – Kawu 2010-11-25 19:20:44