Sql server 如何为分层表(SQL Server)插入唯一的复合ID

Sql server 如何为分层表(SQL Server)插入唯一的复合ID,sql-server,Sql Server,我的表格结构如下: PK ParentPK ID 1 Null A 2 1 B 3 2 C 4 1 D 5 4 E 对于上表,我已经有一个函数可以生成以下结果: PK FullID 3 ABC 5 ADE 此函数获取没有子行的行,并递归地为每一行生成FullID,直到它们的父行 我的应用程序希望用

我的表格结构如下:

PK     ParentPK     ID
1      Null         A
2      1            B
3      2            C
4      1            D
5      4            E
对于上表,我已经有一个函数可以生成以下结果:

PK     FullID
3      ABC
5      ADE
此函数获取没有子行的行,并递归地为每一行生成FullID,直到它们的父行

我的应用程序希望用户输入一个FullID字符串,如“BEF”、“ABD”,然后按Save按钮,然后应用程序负责在内部将其解析为合适的层次结构(由多行组成)并将其插入表中

问题是,应用程序如何保证FullID的唯一性?我需要能够拒绝重复的用户输入的完整ID

我知道我可以先使用我的函数检查FullID,然后如果它不存在,我可以执行插入。但是,如果这些步骤是在非原子操作中执行的,则在高流量使用中可能会输入重复的FullID


我应该将其包装在存储过程中吗?使用开始/提交事务块?还是有更好的方法?非常感谢。

所以您正在寻找类似的产品

BEGIN TRAN
if not exists (select a.PK from GetFullID(a.PK))
begin
    --do operation--
end
commit TRAN

事实上,您正面临这样的问题,这是一种强烈的代码气味,表明您的数据模型存在缺陷。如果需要唯一约束,则应通过唯一约束来强制这些约束。换句话说,“BEF”、“ABD”完整ID应该显式地保存在存储中的某个位置,并使用普通的唯一索引在完整ID列上强制唯一性。

Hi,UniqueKey在哪个字段?FullID不是表中的持久字段,它是由函数生成的。我不会将FullID插入任何表中。FullID字段是由如下函数动态生成的:从TableData a中选择a.PK、dbo.GetFullID(a.PK)作为FullID。上述函数的结果不会插入任何表中。现在我如何保证FullID的唯一性,即使它没有插入到任何表中?dbo.GetFullID(a.PK)是表或标量值函数?dbo.GetFullID()是一个标量函数,它接受任何PK,并在varchar中返回FullID,它通过递归地将ID连接到其父级来工作。