如何使用另一个表的列创建表?

时间:2010-11-25 18:53:50

标签: sql mysql

我是mysql的新手。我知道这是一个非常基本的问题,但我无法弄清楚如何:(? 我最初的尝试:

CREATE TABLE Node(  
  Id INT( 3 ),  
  Position VARCHAR( 12 ),  
  FoodTax INT( 2 ),  
  HasTreasureMap TINYINT( 1 ),  
  CurrentPlayer Player, 
  PRIMARY KEY( Id ) 
);

在这种情况下,'播放器'是我要添加的另一个表。我怎么能这样做?

2 个答案:

答案 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 UPDATEON 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