【问题标题】:Is primary key auto increment always needed in a table?表中是否总是需要主键自动递增?
【发布时间】:2016-03-07 07:30:04
【问题描述】:

我有一个代表连接到游戏室的用户的表格。它看起来像这样:

id | gameRoomId | userId
------------------------
 0    abc          bob
 1    xyz          joe
 2    xyz          frank
 ...

有没有办法可以删除自动增量主键id 列?我没有将它用于任何查询,也不打算这样做。

gameRoomIduserId 分别有一个通用索引。

我现在正在使用 mysql,如果重要的话,最终可能会切换到 postgres。

【问题讨论】:

  • 那么当用户断开连接时如何将其从游戏室桌子上移除?
  • GameRoomID 和 userID 的组合所代表的自然键。并且有些代理键除了唯一之外没有任何意义。在一般系统设计中;拥有代理键​​通常是有意义的。 1)它允许您基于 ONE 值而不是组合键值获取数据集 2)当键本身发生变化时它不会改变,因此关系更容易维护。但两种思想流派都有效。 agiledata.org/essays/keys.html
  • 最近我开始在这些类型的表中添加标识列,但这只是因为如果没有实体框架会抱怨。

标签: sql database-design primary-key


【解决方案1】:

表不一定要有主键约束。如果表确实有主键,则不必自动生成该键。在某些情况下,甚至可以自动生成给定的主键也没有任何意义。

您应该能够像这样从数据库中删除现有的主键列:

alter table my_table drop column id;

或者你可以避免一开始就创建它。

这是否明智取决于您的情况。

【讨论】:

    【解决方案2】:

    您的表看起来像一个关系表。它代表了游戏室和用户之间的多对多关系。假设两者的给定组合只能出现一次(这似乎是合理的),您可以声明这两个列的复合主键,并且不使用 id 字段。

    一些设计工具需要一个简单的主键,但这不是关系建模的一部分。

    在物理层面,声明主键会产生多种后果。为您创建的索引将是一个复合索引。如果您将整数用于用户 ID 和 gemeroomid,而不是您显示的字符串,则效率会更高一些。

    只要不声明任何主键,我不建议这样做。迟早,您的应用程序中会出现一个错误,其中允许重复行,并且您将开始从查询中获得意想不到的结果。让 DBMS 帮助您管理数据要好得多。

    【讨论】:

      【解决方案3】:

      没有。

      主键必须是唯一的,并且必须 100% 保证,并且 NON NULL 如果可能的话,主键应该是稳定的并且不会改变。 所以您不必这样做,但这是一个不错的选择,因为没有其他自然唯一的数据,而且您不希望拥有大量主键。

      要回答您的子问题,您不会真的想回答,它不需要太多数据而且它是独一无二的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 2020-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多