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

时间:2009-10-17 04:25:26

标签: 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。

我的应用程序希望用户输入一个FullID字符串,例如“BEF”,“ABD”,然后按“保存”按钮,然后将其应用程序义务内部解析为合适的层次结构(由多行组成) )并将它们插入表格。

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

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

我应该将它包装在存储过程中吗?使用Begin / Commit Transaction块?或者有更好的方法吗?非常感谢。

2 个答案:

答案 0 :(得分:0)

所以你正在寻找像这样的东西

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

答案 1 :(得分:0)

您遇到类似问题的事实是强大的代码味道,您的数据模型存在缺陷。如果您需要唯一约束,那么它们应该由唯一约束强制执行。换句话说,'BEF','ABD'完整ID应该在某个地方明确地保存在存储中,并且在具有普通唯一索引的完整id列上强制执行唯一性。