主键和外键?

时间:2011-12-15 04:25:54

标签: mysql database

创建数据库时,如果一个表只包含来自其他表的2个主键,会发生什么情况,我假设它们都是外键。表中是否必须有主键?

4 个答案:

答案 0 :(得分:2)

只有两个外键的链接表,没有别的(没有添加代理键来制作一个简单的无意义的主键)通常会被限制为唯一(否则你将无法区分副本 - 这也是一个违反正常形式)所以你经常只需将这两个键组合在一起作为复合构成主键(PK必须是唯一的定义,它们是这种链接表的PK的自然选择) 。主键中这些列的顺序通常由最常见的搜索顺序决定 - 即personid,accountid可能首先在personid上的复合主键中具有personid。

答案 1 :(得分:1)

没有;表不必有主键。

他们经常(通常是?)在他们像这样链接/映射表时不会这样做。

答案 2 :(得分:0)

表不一定需要关联主键。我完全有效如下

<强> Table_Album

pkey | name
1    | name1
2    | name2

<强> Table_Song

pkey | name
1    | song1
2    | song2
3    | song3

然后你可以有一个表格

<强> Table_Album_Song_Map

id | Album | Song  # Here id is just row number and not primary key
1  | name1 | song1
2  | name1 | song2
3  | name2 | song3

希望有所帮助

答案 3 :(得分:0)

如果您有关联实体或表,最好创建一个由父项双键组成的复合主键。在该示例中,在Album-Song-Map的Album-Song-Map上将存在唯一性约束。如果您不将这些作为主键并使组合成为唯一,那么您可以在Album-Song-Map中使用重复项。 Album-Song-Map的复合键是父母双方的关键,但它们分别是回到父母,Album和Song的外键。根据我的经验,关联实体通常不仅用于映射,还包含一些业务属性。例如,假设该歌曲在一个专辑中具有与另一个专辑不同的持续时间(播放时间)。此属性必须进入Album-Song-Map。我使用大量音乐进行舞蹈,而且不同专辑中歌曲的持续时间通常不同。