Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何创建一个列为另一个表的表?_Sql_Mysql - Fatal编程技术网

Sql 如何创建一个列为另一个表的表?

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”是我要添加的另一个表。我如何才能

我是mysql的新手。我知道这是一个非常基本的问题,但我不知道如何解决:(?)? 我最初的尝试是:

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来击败它如果我给了你太多的信息,很抱歉,但这些都是你无论如何都会遇到的事情

祝你今天愉快


Al

Hi Orbling,谢谢你的回复。我有400个节点,但我只有4个玩家。那么将玩家添加为外键有意义吗?这是一个游戏地图,我想检查当前节点中是否有玩家。我想将其保留在java代码中,但只想尝试使用mysql。你需要一门关于SQL和DB设计的基础课程n、 这里可以找到一些实用的信息:@Chan如果你只有4名玩家,那么你是否需要
玩家
表很大程度上取决于你是否需要为这些玩家存储可更改的信息。如果不需要,只需存储玩家ID并忘记第二个表。如果你有表,那么是的,保留键。@C无论您是否有一个单独的
Player
表:如果您需要“检查当前节点中是否有播放机”,则不需要键上的
索引,因为您只需查看已知记录上的字段。如果您需要“查找播放机所在的节点”,然后您应该添加
索引
。我添加了另一个名为“IsOccupied”的布尔值.因为我不需要知道某个节点中是否有某个特定的播放器,只要那里有播放器,我就完成了。不过,我以后可能不得不更改我的实现,我仍在开发它。非常感谢你的推荐。谢谢阿尔瓦罗!顺便问一下,你是从cpp home.com来的吗?不客气。不,我不是从c++网站来的。你好,艾尔