代码之家  ›  专栏  ›  技术社区  ›  Chaitanya

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

  •  6
  • Chaitanya  · 技术社区  · 15 年前

    “每个表只能有一个标识列”

    为什么会这样?以一辆汽车为例,存在一个唯一的chasis号和一个唯一的注册号。把这个场景描绘成 sql服务器 我们需要一个自定义的实现来实现列的数量。相反,在 甲骨文公司 一张桌子上可以有任意多个序列。为什么对身份栏有限制,有什么具体原因吗?

    有一个车辆模式的场景是一个想象中的场景,我在问自己为什么对标识列有限制。

    6 回复  |  直到 15 年前
        1
  •  9
  •   Martin Smith    15 年前

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

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

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

    baz = 1000 + (bar-1)/10
    
        2
  •  6
  •   DForck42    15 年前

    因为它的值是一样的。如果您将identity(1,1)作为primary,并将identity(100,2)作为primary,您将得到以下结果:

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

    您可以通过以下操作获得第二列:

    ((ID-1)*2)+100

    这是一个线性方程,那么除了作秀还有什么意义呢?

        3
  •  2
  •   Kevin Lacquement    15 年前

    数据存储在数据库中,由 IDENTITY 列。单个这样的列允许使用类似文件系统的存储。有多重的 身份

    我建议你选一个专栏作为 身份 PRIMARY KEY ,而另一个是 UNIQUE KEY . 作为一个用户不会有什么不同,但它会使DBMS高兴。

        4
  •  1
  •   gbn    15 年前
    • Oracle序列不是sqlserver标识列:您可以为它们编写一些代码。它们不是基于CREATE表DDL的开箱即用的
    • 后续的标识栏可以从第一栏开始计算(编辑:如其他人所述)
        5
  •  1
  •   ubergeek    11 年前

    我在MSDN里找不到原因。但是,我怀疑这与SQLServer实现标识列的方式有关。从概念上讲,我认为它更像是表级别的设置或值,而不是列级别的设置或值,列只是访问值的一种方式。我认为这是因为所有与标识值交互的方法都将表作为参数,而不是列,例如IDENT\u SEED、IDENT\u CURRENT和IDENT\u INCR。如果是列级设置,则参数将包括列名。如果表中有多个标识列,那么这些函数将无法工作。

    不过我只是在猜测。

        6
  •  0
  •   nvogel    15 年前