具有两个联结表的表的主键/外键

时间:2019-05-12 02:07:00

标签: mysql sql database

让我们说我有一个带有两个联结表B和C的表A,如何为表A创建主键?我在绘制的图中有两种类型的表,圆圈键是外键。

带有联结表的图像

Image

2 个答案:

答案 0 :(得分:1)

取自教程MySQL Primary Key中的参考:

CREATE TABLE roles(
   role_id INT AUTO_INCREMENT,
   role_name VARCHAR(50),
   PRIMARY KEY(role_id)
);

由于其中的详细信息太少,因此很难提供有关特定问题的信息。

从您的评论中“如果一个表具有两个连接表,它是否需要两个主键?” 。不。

主键实际上是用于定义逻辑模型的逻辑概念(设计机制)。主键是一组属性(列),它们共同唯一标识关系(表)中每个元组(行)的每个末端。主键的规则之一是每个关系只有一个。

如前所述,

使用逻辑模型作为创建物理模型的设计,关系变为表,属性变为列,主键可能成为唯一索引。外键可能成为相关表中的索引,依此类推。

许多RDBMS允许在物理表定义中指定PRIMARY KEY。大多数还允许在物理表上定义FOREIGN KEY。他们对它们所做的工作可能因一个实现而异。许多人使用PRIMARY KEY的定义来定义某种UNIQUE INDEX,以强制“必须唯一标识”表中的每条记录。

因此,不,您的games_directors表不需要,也不需要两个主键。如果您确实选择指定PRIMARY KEY,则需要指定所有唯一标识games_directors表中记录的列-很可能是PRIMARY KEY (game_id, director_id)

类似地,游戏表的主键可能是PRIMARY KEY (game_id),导演可能是PRIMARY KEY (director_id),游戏类型则是PRIMARY KEY (game_type_id)

您可以使用来自games_directors表的外键来确保在添加记录时,游戏表和Directors表中存在相应的Director。在这种情况下,您的games_directors表将具有两个外键关系(一个与游戏,另一个与导演)。但是只有一个主键。

所以您可能最终会遇到这样的情况:

create table games (
     game_id integer,
     PRIMARY KEY (game_id)
  );

create table directors (
    director_id integer,
    PRIMARY KEY (director_id)
    );

CREATE TABLE games_directors (
    game_id     INTEGER NOT NULL,
    director_id INTEGER NOT NULL,
    commission_paid DECIMAL(10,2),

  PRIMARY KEY (game_id, director_id),
  FOREIGN KEY (game_id) REFERENCES games(game_id),
  FOREIGN KEY (director_id) REFERENCES directors(director_id)
);

NB:我没有使用PostgreSql测试以上内容。该语法应适用于大多数RDBMS,但有些可能需要稍作调整。

索引可用于加快对表中各个记录的访问。例如,您可能想在导演名称或导演ID上创建索引(取决于您最频繁地访问该表的方式)。如果您主要使用以下相等条件访问Director表:where director_name = 'fred',则Director_name 可能上的索引才有意义。

随着表中记录数量的增加,索引变得更加有用。

我希望这能回答您的问题。 :-)

答案 1 :(得分:1)

您的游戏表只需要一个主键:它标识每个特定的游戏。在联结表中,主键由游戏主键和导演(或类型)主键组成。