我有一个子表,父表的父键与父表相关联。目前,子表的标准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。答案 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
此方法可能会在更新父表时导致并发。
毕竟,我认为你最好考虑重新设计来解决这个问题。