类似于身份的自动递增记录组的ID

时间:2011-02-17 15:30:26

标签: tsql

我有一个子表,父表的父键与父表相关联。目前,子表的标准ID为int IDENTITY(1,1)。这对我的目的来说是好的,并且不会改变,但是对于用户,当他们查看与父级关联的子行时,他们将看到脱节ID的列表。

我希望显示ID从1开始,并为每组记录增加(如标识列)。

我的孩子表看起来像这样;

ChildID-PK ParentID-FK DisplayID
 1          1           1
 2          1           2
 3          2           1
 4          3           1
 5          1           3

可能的解决方案;

  • 插入记录时,SELECT MAX(DisplayID) + 1 FROM tbl WHERE ParentID = @ParentID用作新记录DisplayID。如果很多人一次编辑一组记录,我就会发现这有问题。
  • 使用ROW_NUMBER()获取DisplayID,但在这种情况下,如果要删除记录,现有记录的DisplayID可能会更改。这不可能发生,因为用户在输入数据时可能会引用特定的DisplayID。

1 个答案:

答案 0 :(得分:0)

我能想到的最安全的方法是创建类似于Oracle序列对象的东西。在Microsoft SQL Server Development Customer Advisory Team blog post中有一个很好的样本(我更喜欢选项2)。

您应该为插入的每个父行创建一个序列:

EXEC usp_CreateNewSeq N'ParentSeq' + @parentId

并获取关联表中每一行的下一个序列:

INSERT INTO [table] VALUES (@childId, @parentId, EXEC 'GetNewSeqVal_'+ @parentId)

我不确定我的语法,但我无法检查它,所以请随时纠正我。


更简单的方法:向名为MaxChildId的父表添加一列,默认值为0.每次添加子行时,都应更新此列并使用其新值作为DisplayID

declare @vid int

UPDATE [ParentTable]
SET @vid = MaxChildId+1, MaxChildId = MaxChildId+1
WHERE Id = ParentID
select @vid

此方法可能会在更新父表时导致并发。


毕竟,我认为你最好考虑重新设计来解决这个问题。