除IDENTITY外还有可编辑的自动增量吗?

时间:2011-04-08 21:56:19

标签: sql sql-server sql-server-2008

我需要这个的原因是我在我的桌子上创建了一个名为display_order的列,现在它是smallint并且数字是预先确定的。

但是,当我用我的软件插入新记录时,我不知道如何获得该列中的最高编号并添加1,所以我想到了自动增加列的可能性,如果我将8更改为9它会相应地改变其他一切。

这可能吗?

3 个答案:

答案 0 :(得分:4)

您的问题的答案是“否”IDENTITY是唯一的自动递增功能(并且这些列不可更新)

但是如果这是一个display_order字段,你不能只让它float允许你在其他项之间插入项目,而不是必须将所有其他项目向下移动以创建间隙吗? / p>

答案 1 :(得分:1)

  
    

但是,当我使用我的软件插入新记录时,我不知道如何获得该列中的最高编号并添加1,

  
Insert MyTable( display_order, .... )
Select (
        Select Max(display_order) + 1
        From MyTable As T1
        ), ...
From MyTable

但是,我不建议这样做。如果display_order是用户可设置的,那么我只假设相对值。因此,如果用户添加了一个display_order = 0的值,那么无关紧要。如果你真的想要加倍努力并提供重新排序display_order的能力,你可以这样做:

Update MyTable
Set display_order = Z.NewSeq
From    (
        Select PKCol
            , Row_Number() Over ( Order By display_order ) As NewSeq
        From MyTable
        ) As Z
    Join MyTable As T
        On T.PKCol = Z.PKCol

答案 2 :(得分:1)

因为每个表只能获得一个IDENTITY列,所以我可能会使用触发器或其他机制(如果存在集中插入存储过程)将其默认为表中的最大数字(如果不是)提供。这避免了SET IDENTITY_INSERT或类似的事情。