“每张表只能有一个 IDENTITY 列”
为什么会这样?以车辆为例,存在唯一的底盘号和唯一的注册号。为了在sql server中描述这个场景,我们需要一个自定义的实现。相反,在Oracle中,您可以在一个表上拥有任意数量的序列。为什么对 IDENTITY 列有限制,有什么具体原因吗?
拥有车辆模式的场景是虚构的,我在质疑自己为什么对身份列有限制。
“每张表只能有一个 IDENTITY 列”
为什么会这样?以车辆为例,存在唯一的底盘号和唯一的注册号。为了在sql server中描述这个场景,我们需要一个自定义的实现。相反,在Oracle中,您可以在一个表上拥有任意数量的序列。为什么对 IDENTITY 列有限制,有什么具体原因吗?
拥有车辆模式的场景是虚构的,我在质疑自己为什么对身份列有限制。
SQL Server 中的标识列具有种子和自动增量。如果我们知道第一个 id 列的值,我们总是可以计算出第二个假设的 id 值应该是多少。
例如,如果这是合法的语法
create table #foo
(
bar int identity(1,10),
baz int identity(1000,1)
)
我们不需要存储 baz 因为它可以从 bar 计算如下。
baz = 1000 + (bar-1)/10
因为这将是相同的值。如果你有身份(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
这是一个线性方程,那么除了展示之外还有什么意义呢?
数据存储在数据库中,由IDENTITY
列键控。单个这样的列允许类似文件系统的存储。拥有多个IDENTITY
列会混淆这个问题。
我的建议是选择您的一列作为IDENTITY
or PRIMARY KEY
,另一列作为UNIQUE KEY
. 作为用户不会有任何区别,但它会让 DBMS 高兴。
我可以找到的 MSDN 中没有解释原因。但是,我怀疑它与 sql server 实现标识列的方式有关。从概念上讲,我认为它更多的是表级别的设置或值,而不是列级别,列只是访问值的一种方式。我认为这是因为所有与标识值交互的方法都将表作为参数而不是列,例如。IDENT_SEED、IDENT_CURRENT 和 IDENT_INCR。如果是列级设置,则参数将包括列名。如果表上有多个标识列,则这些功能将不起作用。
我只是在猜测。
我同意这是一个愚蠢的限制。不过,解决它并不太难。只需创建一个带有 IDENTITY 列的单独表,以纯粹用作序列生成器。插入序列表,使用 SCOPE_IDENTITY() 检索值,然后将值插入到您喜欢的任何位置。然后,您可以根据需要支持任意数量的序列。