gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:11:56 25 4
gpt4 key购买 nike

我有一个通过父表的主键关联到父表的子表。目前,子表的标准 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。

最佳答案

我能想到的最安全的方法是创建类似于 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

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


总而言之,我认为您最好考虑重新设计以解决此问题。

关于tsql - 记录组的类似身份的自动递增 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5030973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com