Sql server中的标识列

时间:2009-05-20 19:42:45

标签: sql sql-server

为什么Sql server在表中不允许多个IDENTITY列?任何具体原因。

8 个答案:

答案 0 :(得分:7)

你为什么需要它? SQL Server使用IDENTITY列跟踪每个表的单个值(当前标识值),因此每个表只能有一个标识列。

答案 1 :(得分:2)

SQL Server将标识存储在内部表中,使用表的id作为密钥。因此,SQL Server不可能在每个表中拥有多个Identity列。

答案 2 :(得分:2)

标识列是数据库表中的一列(也称为字段): -

  1. 唯一标识表格中的每一行
  2. 由数据库生成的值组成
  3. 这很像Microsoft Access中的AutoNumber字段或Oracle中的序列。

    标识列与主键的不同之处在于,其值由服务器管理,并且(在极少数情况下除外)无法修改。在许多情况下,标识列用作主键,但情况并非总是如此。

    SQL Server使用标识列作为键值来引用特定行。因此,只能创建一个标识列。此外,如果没有明确声明标识列,则Sql server内部存储一个单独的列,该列包含每行的键值。如上所述,如果您希望多个列具有唯一值,则可以使用UNIQUE关键字。

答案 3 :(得分:2)

因为MS意识到超过80%的用户只需要每个表一个自动增量列,并且具有第二个(或更多)的解决方法就足够简单了,即创建一个种子= 1的IDENTITY,increment = 1然后计算列将自动生成的值乘以一个因子来改变增量并添加一个偏移来改变种子。

答案 4 :(得分:1)

是的,序列允许多个身份,例如atable中的列,但这里有一些问题。在典型的开发场景中,我看到开发人员在列中手动插入有效值(假设通过序列插入)。稍后,当序列尝试将值插入表中时,由于唯一键冲突,它可能会失败。

此外,在多开发人员/多供应商方案中,开发人员可能对多个表使用相同的序列(因为序列未链接到表)。这可能会导致其中一个表中缺少值。即tableA可能获得值1,而tableB可能使用值2而tableA将获得3.这意味着tableA将具有1和3(缺少2)。

除此之外,还有另一种情况,即您每天都会截断一个表。由于Sequences没有与表的任何链接,截断的表将继续再次使用Seq.NextVal(除非您手动重置序列)导致缺失值或甚至更危险的关节溢出错误。

由于上述原因,我觉得Oracle序列和SQL服务器标识列都适用于它们的目的。我希望oracle实现Identity列的概念,SQL Server实现序列概念,以便开发人员可以根据他们的要求实现这两者中的任何一个。

答案 5 :(得分:0)

标识列的整个目的是它将为表中的每一行包含唯一值。那么为什么在任何给定的表格中你需要不止一个呢?

如果你真的需要不止一个,也许你需要澄清你的问题。

答案 6 :(得分:0)

标识列用于唯一标识表的单个行。如果您希望其他列是唯一的,则可以为您可能需要的每个“标识”列创建一个UNIQUE索引。

答案 7 :(得分:-1)

我一直认为这是SQL Server的任意和不良限制。是的,您只需要一个标识列来实际标识一行,但是有充分理由说明您希望数据库为数据库中的多个字段自动生成一个数字。

这对于Oracle中的序列来说是件好事。他们没有被捆绑在桌子上。您可以使用多个不同的序列在同一个表中填充任意数量的字段。您可以也有多个表共享相同的序列,尽管这可能是一个非常糟糕的决定。但关键是你可以。它更精细,更灵活。

序列的坏处是你必须编写代码来实际递增它们,无论它是在insert语句中还是在表上的on-insert触发器中。关于SQL Server身份的好处是,您所要做的就是更改属性或向表创建添加关键字,然后就完成了。