6

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

为什么会这样?以车辆为例,存在唯一的底盘号和唯一的注册号。为了在sql server中描述这个场景,我们需要一个自定义的实现。相反,在Oracle中,您可以在一个表上拥有任意数量的序列。为什么对 IDENTITY 列有限制,有什么具体原因吗?

拥有车辆模式的场景是虚构的,我在质疑自己为什么对身份列有限制。

4

7 回答 7

9

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

例如,如果这是合法的语法

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

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

baz = 1000 + (bar-1)/10
于 2010-09-27T20:06:44.937 回答
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

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

于 2010-09-27T20:08:11.483 回答
2

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

我的建议是选择您的一列作为IDENTITYor PRIMARY KEY,另一列作为UNIQUE KEY. 作为用户不会有任何区别,但它会让 DBMS 高兴。

于 2010-09-27T20:02:13.243 回答
1
  • Oracle 序列不是 SQL Server IDENTITY 列:您为它们编写一些代码。它们不能根据 CREATE TABLE DDL 开箱即用
  • 任何后续的 IDENTITY 列都可以从第一个列中计算出来(编辑:正如其他人提到的)
于 2010-09-27T20:09:37.973 回答
1

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

我只是在猜测。

于 2015-07-29T18:06:16.043 回答
0

我同意这是一个愚蠢的限制。不过,解决它并不太难。只需创建一个带有 IDENTITY 列的单独表,以纯粹用作序列生成器。插入序列表,使用 SCOPE_IDENTITY() 检索值,然后将值插入到您喜欢的任何位置。然后,您可以根据需要支持任意数量的序列。

于 2010-09-29T19:18:00.650 回答
0

您可以改用计算列,从某个值加上 id 值开始:

CREATE TABLE dbo.TwoIdentity (id INT IDENTITY (1,1) NOT NULL, SecondID AS 100+id, TEXT VARCHAR(50) NULL)

在此处输入图像描述

于 2021-10-18T21:00:33.173 回答