2011-04-08 45 views
0

我需要这个的原因是我在我的桌子上创建了一个名为display_order的列,现在它是smallint并且数字是预先确定的。是否有任何可编辑的Auto-Increment besdies IDENTITY?

但是,当我用我的软件插入新记录时,我不知道如何获得该列中的最高数字并添加1,因此我想过如果更改8时自动递增列的可能性到9它会相应地改变一切。

这可能吗?

+0

让我看看我是否理解你的问题。你希望你的主键在所有情况下自动递增,除非它不应该自动递增? – 2011-04-08 22:01:30

+0

为什么不能简单地将列切换为标识列? – 2011-04-08 22:05:43

+0

嗯,因为标识列不可编辑?至少有没有简单的方法来编辑它,通过MSSQL有一种方法,但通过代码可能更难以实现结果。 – 2011-04-08 22:08:04

回答

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 
4

回答你的问题是“否” IDENTITY是唯一的自动递增的能力(以及这些列不能更新)

但如果这是一个display_order场你就不能让它float让你在其他项目之间插入项目而不是将所有其他项目向下移动以创建间隙?

1

因为每个表只能得到一个IDENTITY列,所以我可能会使用触发器或其他机制(如果存在集中式插入存储过程)将其默认为比表中最高数字多一个(如果未提供)。这避免了必须SET IDENTITY_INSERT或类似的东西。

相关问题