代码之家  ›  专栏  ›  技术社区  ›  roxrook

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

  •  1
  • roxrook  · 技术社区  · 14 年前

    我是mysql的新手。我知道这是一个很基本的问题,但我不知道怎么解决:(? 我最初的尝试:

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

    在这种情况下,“Player”是我要添加的另一个表。我该怎么做?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Orbling    14 年前

    不能在表中添加表,您要做的是添加外键引用,它基本上是另一个表的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 加法会产生一些效果,它会添加一个签入,这样您就不能为 当前玩家 节点 没有的桌子 已经 存在于 Player 桌子,随便 INSERT/UPDATE 尝试此操作将失败。另外,这两个选项 ON UPDATE ON DELETE 告诉数据库如果 玩家 更新或删除,然后通过 触发 节点 桌子。 ON UPDATE CASCADE 意思是如果 Id 一个 玩家 记录被更新为其他内容,它会 级联 进入 节点 表,也更改该值。 ON DELETE SET NULL 声明如果从 玩家 表,然后对应 当前玩家 价值观 节点 应该设置为 NULL .

        2
  •  0
  •   Alvaro    14 年前

    你的桌子可能是这样的

    节点 身份证位置食品税财务地图播放器

    玩家

    玩家姓名

    所以NODE的PLAYER只是PLAYER表的主键ID_PLAYER的外键。

    决定在每个节点中是否总是有一个播放器,或者它可以为空。

    决定您的表引擎搜索是InnoDb还是MyIsam。您的选择将取决于它是一个查询比更新要多得多的表还是另一种方式。如果主要是被查询,选择MyIsam会更快。但是在这种情况下,要知道MyIsam不支持外键,但是您可以通过创建索引并通过它进行连接来战胜它。抱歉,如果我给你太多的信息,但这些是你无论如何都会遇到的事情。

    祝你今天愉快

    艾尔