2009-10-17 7 views
0

Je possède ce tableau structuré comme suit:Comment insérer unique ID composite pour Table hiérarchique (SQL Server)

PK  ParentPK  ID 
1  Null   A 
2  1   B 
3  2   C 
4  1   D 
5  4   E 

Pour le tableau ci-dessus, je l'ai déjà une fonction qui peut générer les résultats suivants:

PK  FullID 
3  ABC 
5  ADE 

Cette fonction prend les lignes qui n'ont pas d'enfants et génère de manière récursive FullID pour chaque ligne jusqu'à leurs parents. Mon application s'attend à ce que les utilisateurs entrent une chaîne de FullID, tels que "BEF", "ABD", et appuyez sur le bouton Enregistrer, puis le devoir de l'application de l'analyser en interne à une structure hiérarchique appropriée (qui se compose de plusieurs lignes) et les insérer dans la table.

La question est, comment l'application peut garantir l'unicité de FullID? Je dois pouvoir rejeter le FullID en double entré par les utilisateurs.

Je comprends que je peux vérifier la FullID d'abord en utilisant ma fonction, si elle est existe pas, je peux effectuer les inserts. Mais si ces étapes sont effectuées dans une opération non-atomique, un FullID en double peut être entré dans un trafic important.

Dois-je envelopper dans une procédure stockée? utilisant le bloc Begin/Commit Transaction? ou y a-t-il une meilleure façon de le faire? Merci beaucoup.

Répondre

0

Vous cherchez quelque chose comme ça

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

Salut, UniqueKey dans quel domaine? FullID n'est pas un champ persistant dans une table, il est généré par une fonction. – danjunior1807

+0

quel champ de table souhaitez-vous insérer le FullID? ce champ de table !!! – anishMarokey

+0

Je n'insère pas le FullID dans une table. Le champ FullID est généré à la volée par une fonction comme celle-ci: Sélectionnez a.PK, dbo.GetFullID (a.PK) comme FULLID From TableData a Le résultat de la fonction ci-dessus N'EST PAS INSÉRÉ dans aucune table . Maintenant comment puis-je garantir l'unicité du FullID même s'il n'est inséré dans aucune table? – danjunior1807

0

Le fait que vous êtes confronté à ce genre de questions est une odeur de code fort que votre modèle de données est erronée. Si vous avez besoin de contraintes uniques, elles doivent être appliquées par une contrainte unique. En d'autres termes, l'ID complet 'BEF', 'ABD' doit être explicitement conservé dans le stockage quelque part et l'unicité appliquée sur la colonne id complète avec un index unique ordinaire.

Questions connexes