sql - 每个 MySQL 表都应该有一个自动递增的主键吗?

标签 sql database database-design normalization

  • 我了解主键的值(value)。
  • 我了解索引的值(value)。

每个 MySQL 表是否应该有一个自动递增的主键(最好是 INT 字段类型)?

更新

@Raj More 的回答似乎最有效。然而,当我想到它时,问题是这个自动递增的主键 ID 将如何与其他表相关联。例如:

表1

ID  |   firstname  |   lastname | email
----------------------------------------
1   |    john      |   doe      | 1@email.com
2   |    sarah     |   stow     | 2@email.com
3   |    mike      |   bro      | 3@email.com

表2

ID  | memberid |    display      |    address
--------------------------------------------
1   |    1     | funtime zone    |   123 street
2   |    3     | silly place llc |  944 villa dr 

在上面的示例中,消费者可能会来到网站并选择注册免费产品/服务。如果消费者选择,他们可以提供额外的信息(存储在表 2 中)用于额外的邮寄等。我看到的问题是这些表如何与“主键自动递增字段”相关。在表 2 中,“memberid”与表 1 的 ID 相关,但这不是“非常”清楚。放入表 2 中的任何新信息都将递增 1,而并非所有消费者都会选择参与表 2 所需的数据。

最佳答案

我不是代理键的 super 粉丝。我还没有看到我更愿意为数据库的每个表使用一个的场景。

我会说

阅读这个答案: surrogate-vs-natural-business-keys


以上内容可能会被视为讽刺或煽动性的内容(尽管赞成票的数量惊人地多),因此已将其删除。

在一般情况下,有很多关于代理项和自然键的问题和答案,所以我觉得这个问题更像是重复的。我的观点是代理键很好而且非常有用,主要是因为自然键可以在连接表链的低端导致非常大的主键 - 许多 RDBMS 处理不好,聚簇索引变大等. 但是说“每个 MySQL 表都应该有一个自动递增的主键”是一个非常绝对的说法,我认为在某些情况下它们确实提供很少或根本没有提供。

由于 OP 更新了问题,我将尝试针对该特定主题发表评论。

我认为这正是自动递增主键不仅无用而且会增加负值的情况。假设table1table21:1关系,那么memberid可以是Primary table1 的键 和一个外键

添加一个自动递增的 id 列会添加一个索引,如果它是一个聚集索引(如 InnoDB PK 索引),则会增加 memberid 索引的大小。更重要的是,如果您有这样一个自动递增的 id,则必须使用此 id 完成 table2 与其他表的一些 JOIN(与 1:n 中的表的 JOIN) > 与 table2 的关系)和一些使用 memberid(1:n 中表的 JOIN 与 table1 的关系)。如果您只有 memberid 这两种类型的 JOIN 都可以 使用 memberid 完成。

关于sql - 每个 MySQL 表都应该有一个自动递增的主键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7341027/

相关文章:

SQL如何处理页面上的大量评论/注释

mysql - 在 SQL 中按年份排序

mysql - 是否可以在 SQL 中 LEFT JOIN @variable 表

mysql - 使用下划线而不是空格是否有任何 sql 性能提升?

mysql - 1M 行、1 个表、几列与 300 个表、3000 行、几列与 300 列、3000 行、1 个表?

mysql - 常量表设计 MySQL 最佳实践

sql - 数据库设计 - 重写值

database - 如何使用mongoimport导入csv

database - 在 Linux 中创建小型数据库应用程序的最简单方法

php - 在 PHP 脚本中,在连接/发送查询到数据库时应该如何处理异常?