Sql 如何创建一个列为另一个表的表?
我是mysql的新手。我知道这是一个非常基本的问题,但我不知道如何解决:(?)? 我最初的尝试是:Sql 如何创建一个列为另一个表的表?,sql,mysql,Sql,Mysql,我是mysql的新手。我知道这是一个非常基本的问题,但我不知道如何解决:(?)? 我最初的尝试是: CREATE TABLE Node( Id INT( 3 ), Position VARCHAR( 12 ), FoodTax INT( 2 ), HasTreasureMap TINYINT( 1 ), CurrentPlayer Player, PRIMARY KEY( Id ) ); 在本例中,“Player”是我要添加的另一个表。我如何才能
CREATE TABLE Node(
Id INT( 3 ),
Position VARCHAR( 12 ),
FoodTax INT( 2 ),
HasTreasureMap TINYINT( 1 ),
CurrentPlayer Player,
PRIMARY KEY( Id )
);
在本例中,“Player”是我要添加的另一个表。我如何才能做到这一点?您不能在表中添加表,您要做的是添加外键引用,它基本上是另一个表的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数据库引擎,则可以在节点
表的定义中直接指定表之间关系的性质,如下所示
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
);
添加
外键
会产生一些效果,它会添加一个签入,这样您就无法在节点
表中为当前播放器
设置一个值,而该值在播放器
表中并不存在,任何插入/更新
尝试此操作都会失败。此外,更新时的和两个选项也会失败ode>ON DELETE
告诉数据库如果Player
的记录被更新或删除,则通过节点
表上的触发器自动执行操作。ON UPDATE CASCADE
意味着如果Player
记录的Id
被更新为其他内容,它将级联到节点
表,也更改该值。上的DELETE SET NULL
表示,如果从Player
表中删除记录,则节点
中相应的CurrentPlayer
值应设置为NULL
您的表可能如下所示
节点
ID位置食品税地图播放器
玩家
ID\u玩家名称\u玩家
因此,节点的PLAYER只是PLAYER表的主键ID\u PLAYER的外键
决定在每个节点中是否始终有一个玩家,或者该玩家可以为空
决定您的表引擎搜索是InnoDb还是MyIsam。您的选择将取决于它是一个查询量比更新量大得多的表,还是相反。如果它主要是被查询的,请选择MyIsam,它会更快。但在这种情况下,请知道MyIsam不支持外键,但您可以通过creati来击败它如果我给了你太多的信息,很抱歉,但这些都是你无论如何都会遇到的事情
祝你今天愉快
AlHi Orbling,谢谢你的回复。我有400个节点,但我只有4个玩家。那么将玩家添加为外键有意义吗?这是一个游戏地图,我想检查当前节点中是否有玩家。我想将其保留在java代码中,但只想尝试使用mysql。你需要一门关于SQL和DB设计的基础课程n、 这里可以找到一些实用的信息:@Chan如果你只有4名玩家,那么你是否需要
玩家
表很大程度上取决于你是否需要为这些玩家存储可更改的信息。如果不需要,只需存储玩家ID并忘记第二个表。如果你有表,那么是的,保留键。@C无论您是否有一个单独的Player
表:如果您需要“检查当前节点中是否有播放机”,则不需要键上的索引,因为您只需查看已知记录上的字段。如果您需要“查找播放机所在的节点”,然后您应该添加索引
。我添加了另一个名为“IsOccupied”的布尔值.因为我不需要知道某个节点中是否有某个特定的播放器,只要那里有播放器,我就完成了。不过,我以后可能不得不更改我的实现,我仍在开发它。非常感谢你的推荐。谢谢阿尔瓦罗!顺便问一下,你是从cpp home.com来的吗?不客气。不,我不是从c++网站来的。你好,艾尔