我有一个不同的时间来确定我的主键使用的内容。
我的表:
| 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键或其他表中的任何其他内容,因此添加它将毫无用处。
我还可以将页面,性别和年龄结合起来,并将它们作为主键,但我不确定它的优点是什么。我尝试了谷歌搜索一段时间,但仍然不知道该怎么做。
答案 0 :(得分:2)
请阅读MySQL的文档:
表的主键表示列或列集 您在最重要的查询中使用的。它有一个相关的索引, 用于快速查询性能。从NOT查询性能优势 NULL优化,因为它不能包含任何NULL值。随着 InnoDB存储引擎,表数据是物理组织的 基于主键列或的超快速查找和排序 列。
如果你的桌子很重要,但没有明显的表格 要用作主键的列或列集,您可以创建一个 使用自动增量值分隔列以用作主键。 这些唯一ID可以作为指向其他行中相应行的指针 使用外键连接表时的表。
感谢@AaronDigulla的解释......:
必要吗?没有在幕后使用?好吧,它被保存到磁盘和 保留在行缓存等。删除将略微增加你的 性能(使用精确到毫秒精度的手表)。
但是...下次有人需要创建对此的引用 桌子,他们会诅咒你。如果他们勇敢,他们会添加一个PK(和 等待很长时间让DB创建列)。如果他们不是 勇敢或愚蠢,他们将开始使用业务创建参考 密钥(即数据列)将导致维护噩梦。
结论:由于PK的成本(即使它没有使用ATM) 太小了,就这样吧。
根据我的经验和知识,如果您没有定义主键,数据库将创建一个隐藏的主键。因此,在您的情况下,最好的解决方案是创建它。
答案 1 :(得分:1)
我不认为使用自动增量键,或使用性别和年龄作为复合主键会显着改变性能。
无论如何,性别和年龄的主键应该是一个不错的选择,因为它也可以防止重复的条目(你不能在其他记录中重复相同的值对)并使表结构更加清晰。