我的表格结构如下:
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块?或者有更好的方法吗?非常感谢。
答案 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列上强制执行唯一性。