答案 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)
您的游戏表只需要一个主键:它标识每个特定的游戏。在联结表中,主键由游戏主键和导演(或类型)主键组成。