我是mysql的新手。我知道这是一个非常基本的问题,但我无法弄清楚如何:(? 我最初的尝试:
CREATE TABLE Node(
Id INT( 3 ),
Position VARCHAR( 12 ),
FoodTax INT( 2 ),
HasTreasureMap TINYINT( 1 ),
CurrentPlayer Player,
PRIMARY KEY( Id )
);
在这种情况下,'播放器'是我要添加的另一个表。我怎么能这样做?
答案 0 :(得分:2)
你不能在表格中添加表格,你要做的是添加一个外键引用,它基本上是另一个表的ID(或PRIMARY KEY是什么),并分别制作另一个表。
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
添加会产生一些影响,它会添加一个签入,以便您无法在CurrentPlayer
表格中为Node
设置已经< / em>存在于Player
表中,任何INSERT/UPDATE
尝试此操作都会失败。此外,两个选项ON UPDATE
和ON DELETE
告诉数据库,如果更新或删除Player
中的记录,则通过触发器自动执行操作Node
表。 ON UPDATE CASCADE
表示如果Id
记录的Player
更新为其他内容,则会级联到Node
表中,价值也是。 ON DELETE SET NULL
指出如果从Player
表中删除记录,则CurrentPlayer
中相应的Node
值应设置为NULL
。
答案 1 :(得分:0)
你的桌子看起来像这样
NODE ID POSITION食品税收津贴玩家
球员
ID_PLAYER NAME_PLAYER
所以NODE的玩家只是玩家表的主要ID_PLAYER的外键。
决定在每个节点中是否总是有一个玩家,或者它是否为空。
决定您是否希望表引擎搜索为InnoDb或MyIsam。您的选择将取决于它是否是一个比更新或反之更多的查询表。如果主要是查询,选择MyIsam会更快。但在这种情况下,要知道MyIsam不支持外键,但你可以通过创建索引并通过它来进行连接来击败它。对不起,如果我给你太多信息,但这些都是你要碰到的东西。
度过愉快的一天
的Al