每个MySQL表都应该有一个自动递增的主键吗?
- 我了解主键的价值。
- 我了解索引的价值。
每个 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中,“成员ID”与表1的ID相关,但“不清楚”。放入表2的任何新信息都将增加1,而并非
所有 消费者都会选择参加表2所需的数据。
-
上面的内容可能被视为讽刺或火红的(尽管有很多令人惊讶的投票),因此将其删除。
在一般情况下,关于代理键和自然键有很多问题和答案,所以我觉得这个问题更像是重复的问题。我的看法是代理键很好而且非常有用,主要是因为自然键可以在连接表链的低端导致很大的主键-
而且许多RDBMS不能很好地处理它,聚集索引变大等等。但是说“ _ 每个
MySQL表都应该有一个自动递增的主键_”是一个非常绝对的说法,我认为在某些情况下它们实际上提供的很少甚至没有。自从OP更新了问题以来,我将尝试就该特定主题发表评论。
我认为这正是自动递增主键不仅无用,而且会增加负值的情况。假设
table1
和table2
在1:1
关系中,memberid
既可以是Primary Key
和一Foreign Key
对table1
。添加一个自动递增的id列会添加一个索引,如果它是一个聚集的索引(如InnoDB
PK索引),则会增加索引的大小memberid
。更有甚者,如果你有这样一个自动递增的ID,有些JOIN表2至其他表将不得不使用来完成这个id
(这些连接到表中1:n
关于表2)和一些使用memberid
(这些连接到表中1:n
关系table1
)。如果您memberid
同时拥有这两种类型的JOIN,则可以使用memberid
。