在表格中使用自动增量主键有什么用,如果我在查询时没有在任何地方使用它。
例如我有一个表单,用户注册自己的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下标记了这个问题,因为它可能属于两者。
答案 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是您自然唯一的聚簇索引。