- 我了解主键的值(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 更新了问题,我将尝试针对该特定主题发表评论。
我认为这正是自动递增主键不仅无用而且会增加负值的情况。假设table1
和table2
是1: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/