2010-06-21 7 views
0

J'ai une question concernant les séquences postgresql. Par exemple, pour un type de données bigserial, est-il vrai que la séquence est avancée, alors le numéro est récupéré et même si l'insertion/validation échoue, la séquence ne fait pas de retour en arrière. Ce qui signifie que la prochaine fois que je pourrais faire une insertion à la table, cela pourrait être une lacune dans le numéro de séquence.question concernant les séquences postgresql

Theres un déclencheur de ligne avant d'insérer sur ma table et Im utilisant psycopg2.

merci d'avance.

Répondre

4

même si l'insertion/commis est ne réussit pas, la séquence ne pas backtracks. Ce qui signifie que la prochaine fois que je pourrais faire une insertion à la table, cela pourrait être une lacune dans le numéro de séquence.

Oui, c'est vrai, et c'est très bien. On veut généralement une séquence pour obtenir des valeurs dans une table qui sont uniques (généralement pour un PK) et les lacunes ne comptent pas du tout.

Si vous êtes curieux: c'est un comportement naturel si l'on pense à la concurrence. Supposons qu'une transaction T1 insère une ligne, récupère une PK1 d'une séquence, utilise cette valeur pour construire d'autres enregistrements dans d'autres tables ... entre-temps (avant que T1 ne commette) une autre transaction T2 insère une ligne dans la même table. Ensuite, les annulations T1 et les validations T2 ...

BTW: Si vous voulez une séquence "sans interstice" ... demandez-vous d'abord si vous voulez vraiment cela (en général, vous ne le faites pas vraiment - et vous devez pointer fréquemment vers un problème conceptuel dans votre conception) ... mais si vous en avez vraiment besoin, vous pouvez lire this.

+2

Suite en haut: Vous ne devriez vraiment pas vous inquiéter des "trous" dans une clé de substitution. Le faire (selon mon expérience) indique un substitut qui n'est pas assez opaque. Et dans la mesure où une séquence, il est garanti augmentation monotone (à moins de réinitialiser) alors ... –

+1

même si elle est en augmentation devrait être superflue –

+0

droite, je l'ai eu les gars. Merci pour l'explication. – goh

3

Le retour en arrière nécessiterait un verrouillage jusqu'à la fin. Ce serait mauvais, surtout quand 10 tables peuvent toutes utiliser la même séquence. Si vous voulez une commande n'utilisez pas une séquence, utilisez une fonction de fenêtre comme row_number().

+0

merci pour l'aide. – goh