“每个表只能有一个IDENTITY列” - 为什么?

时间:2010-09-27 19:57:45

标签: sql-server identity-column database-design

“每个表格只能有一个IDENTITY列”

为什么会这样?以车辆的情景为例,存在唯一的登记号码以及唯一的登记号码。要在 sql server 中描述这种情况,我们需要对列进行自定义实现。相反,在 Oracle 中,您可以在表格中拥有任意数量的序列。为什么IDENTITY列有限制,有什么特殊原因吗?

拥有车辆架构的场景是一个虚构的问题,我在质疑为什么对标识栏有限制。

6 个答案:

答案 0 :(得分:9)

SQL Server中的标识列具有种子和自动增量。如果我们知道第一个id列的值,我们总是可以计算第二个假设id值应该是什么。

e.g。如果这是合法的语法

create table #foo
(
bar int identity(1,10),
baz int identity(1000,1)
)

我们不需要存储baz,因为它可以从bar计算如下。

baz = 1000 + (bar-1)/10

答案 1 :(得分:6)

因为它的值是相同的。如果你有身份(1,1)作为主要身份和身份(100,2),你会得到这些结果:

1     100
2     102
3     104
4     106
5     108
6     110
7     112
8     114
9     116
10    118

你可以通过这样做获得第二列:

((ID-1)* 2)100

这是一个线性方程,那么除了show之外还有什么意义?

答案 2 :(得分:2)

数据存储在数据库中,由IDENTITY列键入。单个这样的列允许类似文件系统的存储。拥有多个IDENTITY列会使问题混乱。

我的建议是选择一个列为IDENTITYPRIMARY KEY,另一列为UNIQUE KEY。作为用户,没有区别,但它会让DBMS满意。

答案 3 :(得分:1)

  • Oracle序列不是SQL Server IDENTITY列:您为它们编写了一些代码。它们不能基于CREATE TABLE DDL
  • 开箱即用
  • 任何后续IDENTITY列都可以从第一个列中解析出来(编辑:正如其他人提到的那样)

答案 4 :(得分:1)

在MSDN中没有解释我找不到的原因。但是,我怀疑它与sql server实现标识列的方式有关。从概念上讲,我认为它更多是表级别的设置或值,而不是列级别,而列只是访问该值的一种方式。我认为这是因为所有与身份值交互的方法都将表作为参数而不是列。 IDENT_SEED,IDENT_CURRENT和IDENT_INCR。如果是列级别设置,则参数将包括列名称。如果表上有多个标识列,则这些函数将不起作用。

我只是猜测。

答案 5 :(得分:0)

我同意这是一个愚蠢的限制。尽管如此,解决它并不困难。只需创建一个带有IDENTITY列的单独表,就可以纯粹用作序列生成器。插入序列表,使用SCOPE_IDENTITY()检索值,然后在任意位置插入值。然后,您可以根据需要支持尽可能多的序列。

相关问题