“每个表格只能有一个IDENTITY列”
为什么会这样?以车辆的情景为例,存在唯一的登记号码以及唯一的登记号码。要在 sql server 中描述这种情况,我们需要对列进行自定义实现。相反,在 Oracle 中,您可以在表格中拥有任意数量的序列。为什么IDENTITY列有限制,有什么特殊原因吗?
拥有车辆架构的场景是一个虚构的问题,我在质疑为什么对标识栏有限制。
答案 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
列会使问题混乱。
我的建议是选择一个列为IDENTITY
或PRIMARY KEY
,另一列为UNIQUE KEY
。作为用户,没有区别,但它会让DBMS满意。
答案 3 :(得分:1)
答案 4 :(得分:1)
在MSDN中没有解释我找不到的原因。但是,我怀疑它与sql server实现标识列的方式有关。从概念上讲,我认为它更多是表级别的设置或值,而不是列级别,而列只是访问该值的一种方式。我认为这是因为所有与身份值交互的方法都将表作为参数而不是列。 IDENT_SEED,IDENT_CURRENT和IDENT_INCR。如果是列级别设置,则参数将包括列名称。如果表上有多个标识列,则这些函数将不起作用。
我只是猜测。
答案 5 :(得分:0)
我同意这是一个愚蠢的限制。尽管如此,解决它并不困难。只需创建一个带有IDENTITY列的单独表,就可以纯粹用作序列生成器。插入序列表,使用SCOPE_IDENTITY()检索值,然后在任意位置插入值。然后,您可以根据需要支持尽可能多的序列。