Vous n'êtes pas identifié(e).
Pages : 1
Bonsoir,
Pour gérer l’auto-incrémentation d'une clé primaire est-il préférable de faire cela avec un Trigger ou bien en utilisant un champ de type Serial ? Pourquoi ?
Merci
Dernière modification par Crackerz (11/04/2014 23:46:33)
Hors ligne
Bonsoir,
Il faut absolument utiliser un serial (c'est-à-dire une séquence au final), sinon vous allez au devant de gros problèmes lors d'inserts concurrents et/ou de transactions.
Julien.
https://rjuju.github.io/
Hors ligne
Merci rjuju
Pourriez-vous m'indiquer ce que vous appelez une séquence ?
Hors ligne
Bonjour,
Une séquence peut être créée de 2 manières :
- type serial : la séquence est prise en charge par le moteur qui incrémente automatiquement la colonne concernée.
- create sequence : la séquence est un objet à part entière qui est manipulé avec des fonctions (setval, nextval, etc...)
Tu peux lire cette partie de la doc pour en savoir plus :
http://docs.postgresql.fr/9.2/sql-createsequence.html
http://docs.postgresql.fr/9.2/functions-sequence.html
Maintenant le choix entre les deux ?
Comme dirait rjuju, si tu ne veux pas avoir de problème (par exemple un décalage dans la séquence) tu dois utiliser le type serial.
Si le risque de décalage n'est pas important et que tu souhaites gérer la séquence via ton appli alors tu peux utiliser une séquence et les fonctions de séquences.
Cordialement,
Sébastien.
Hors ligne
Pour être plus précis, le type serial (et bigserial) n'est qu'un alias pour créer un champ de type integer (ou bigint) possédant un séquence, et avec en clause "default" un appel à nextval de la séquence. Même en utilisant un type serial, il reste possible de ne pas utiliser cette séquence lors de l'ajout d'une ligne (par exemple en insérant explicitement une valeur dans la colonne en question). Bref, même en utilisant un type serial, il faut quand même faire attention à ce que l'on fait.
Julien.
https://rjuju.github.io/
Hors ligne
Merci tout est plus claire
Une dernière question sur l'auto-incrémentation.
Si je veux qu'un attribut s'auto-incrémente en fonction d'un autre, une des solutions est de passer par les trigger ? Prenons un exemple courant, celui des Factures. Nous avons deux attributs : FactureId et ClientId il faut que les numéro de FactureId soit séquentielle est s'incrémente donc en fonction du Client.
Merci.
Hors ligne
Oui, seul un trigger peut gérer ça.
Guillaume.
Hors ligne
Ok, merci
Hors ligne
Pages : 1