我需要这个的原因是我在我的桌子上创建了一个名为display_order的列,现在它是smallint并且数字是预先确定的。
但是,当我用我的软件插入新记录时,我不知道如何获得该列中的最高编号并添加1,所以我想到了自动增加列的可能性,如果我将8更改为9它会相应地改变其他一切。
这可能吗?
答案 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
或类似的事情。