自动增量与唯一键区别当您将它们放在一个表中时?

时间:2014-01-10 09:45:49

标签: php mysql sql sql-server sql-server-2008

在表格中使用自动增量主键有什么用,如果我在查询时没有在任何地方使用它。

例如我有一个表单,用户注册自己的userid / passwd等,表格填充如下。

user table

id int auto increment primary key
userid unique key 
passwd varchar
etc
etc

每当我检查登录用户或任何其他查询时,我总是使用select * from tbname where userid = ? 我有一个唯一的索引,那么在id列上使用主索引有什么用?

是否会有任何速度差异?

编辑:我的用户名实际上是一个用户名,选择我注册的用户。

我在mysql和sql server下标记了这个问题,因为它可能属于两者。

4 个答案:

答案 0 :(得分:4)

自动增量和键(主要或唯一)是两回事。

密钥类型之间的区别是:

主键:

  • 每张桌子只有一个
  • 不允许空值
  • 主键是唯一键标识符

唯一关键:

  • 表中可以有许多唯一键
  • 允许空置

自动增量是一回事。

在列中选择自动增量时,插入记录时不提供值。数据库将跟踪插入的最后一个增量ID,下一个插入将使用之后的值(增加指定的数量,最常见的是1)

答案 1 :(得分:1)

您的问题更多是关于数据库设计而不是特定的DBMS。你很困惑,因为混合代理键自然键,似乎。

代理键

很好,因为它没有实际意义 - 只需要行识别。这是一种最常见的设计 - 因为您的数据集可能没有其他识别条件或者它们不可靠。你的id似乎是代理密钥。

自然键

在某些特定情况下,表格可能包含自然键 - 即某些属性或属性集可以与代理键相同 - 即标识表中的行 。如果是这样,那么您可以考虑将自然键作为表中的主键。

什么更好?

如果您的userid列具有某种生成算法,则显然无法自动增加,并且它会感知自然键。如果您确定此密钥始终是唯一的 - 那么您的id列是多余的 - 维护列没有任何意义,其唯一的作用(即行标识)已经保留另一栏。事实上没有什么不好的,你的主键列不会自动递增(在这里,我再次假设userid有一些生成算法)。

考虑一下你的id约会 - 因为谁决定 - 要么你需要特殊的行识别列,要么你不需要。但是,如果id没有特殊的生成算法,则userid会更加冗余。在这种情况下,您可以删除id并将userid定义为自动增量。作为结论 - 请记住

  

如果有用,则约定很好

答案 2 :(得分:0)

在这种情况下没用。在普通表设计中,您将在user_id上使用自动增量来生成唯一的主键。如果丢弃自动增量ID列,则可以节省一些索引空间。您应该将user_id设置为primary以避免空值。

自动增量是行ID的自动生成,不会重复。这是生成唯一用户ID的有用方法。但是,如果没有唯一性限制,则不提供唯一性保证,因为您可以返回并编辑值

答案 3 :(得分:0)

代理主键通常是开发人员首选,因为它们不受生活变化的影响。例如,有一天你可能会决定让你的用户更改他们的id,然后你有一个非零的机会搞砸了如果你有其他表通过userid引用这个。使用代理键,无论如何都无需改变。它使用起来更安全。

但我还想提一下,除了主键,唯一键,自动递增键,自然键和代理键之外,还有一个聚簇索引和非聚簇索引的问题。聚簇索引是用于物理存储表行的索引。因此它提供了最快的访问。对于许多初学者而言,主键必须是您的聚集索引并不明显。如果您知道90%的时间您将在查询中使用userid并希望利用它,但不能保证userid永远不会为null(或更改),那么将代理ID作为主要的非群集密钥并使userid是您自然唯一的聚簇索引。