mysql自动增量id与组合字段主键

时间:2017-08-22 14:46:14

标签: mysql database primary-key

我有一个不同的时间来确定我的主键使用的内容。

我的表:

| gender | age   | value | date updated | page id(the forgein key) |
| M      | 15-24 | 100   | some date    | 1
| M      | 25-34 | 120   | some date    | 1
| M      | 35-44 | 110   | some date    | 1
| F      | 15-24 | 190   | some date    | 1
| F      | 25-34 | 230   | some date    | 1

现在我需要添加一个主键。我可以添加一个带有自动增量的id字段并将其设为pk,但该id不会被用作forgein键或其他表中的任何其他内容,因此添加它将毫无用处。

我还可以将页面,性别和年龄结合起来,并将它们作为主键,但我不确定它的优点是什么。我尝试了谷歌搜索一段时间,但仍然不知道该怎么做。

2 个答案:

答案 0 :(得分:2)

请阅读MySQL的文档:

  

表的主键表示列或列集   您在最重要的查询中使用的。它有一个相关的索引,   用于快速查询性能。从NOT查询性能优势   NULL优化,因为它不能包含任何NULL值。随着   InnoDB存储引擎,表数据是物理组织的   基于主键列或的超快速查找和排序   列。

     

如果你的桌子很重要,但没有明显的表格   要用作主键的列或列集,您可以创建一个   使用自动增量值分隔列以用作主键。   这些唯一ID可以作为指向其他行中相应行的指针   使用外键连接表时的表。

感谢@AaronDigulla的解释......:

  

必要吗?没有在幕后使用?好吧,它被保存到磁盘和   保留在行缓存等。删除将略微增加你的   性能(使用精确到毫秒精度的手表)。

     

但是...下次有人需要创建对此的引用   桌子,他们会诅咒你。如果他们勇敢,他们会添加一个PK(和   等待很长时间让DB创建列)。如果他们不是   勇敢或愚蠢,他们将开始使用业务创建参考   密钥(即数据列)将导致维护噩梦。

     

结论:由于PK的成本(即使它没有使用ATM)   太小了,就这样吧。

根据我的经验和知识,如果您没有定义主键,数据库将创建一个隐藏的主键。因此,在您的情况下,最好的解决方案是创建它。

答案 1 :(得分:1)

我不认为使用自动增量键,或使用性别和年龄作为复合主键会显着改变性能。

无论如何,性别和年龄的主键应该是一个不错的选择,因为它也可以防止重复的条目(你不能在其他记录中重复相同的值对)并使表结构更加清晰。