PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 10/04/2014 23:57:54

Crackerz
Membre

[Résolu]Auto-incrémentation

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 smile

Dernière modification par Crackerz (11/04/2014 23:46:33)

Hors ligne

#2 11/04/2014 00:07:17

rjuju
Administrateur

Re : [Résolu]Auto-incrémentation

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.

Hors ligne

#3 11/04/2014 01:02:03

Crackerz
Membre

Re : [Résolu]Auto-incrémentation

Merci rjuju smile
Pourriez-vous m'indiquer ce que vous appelez une séquence ?

Hors ligne

#4 11/04/2014 09:13:11

ruizsebastien
Membre

Re : [Résolu]Auto-incrémentation

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

#5 11/04/2014 09:48:21

rjuju
Administrateur

Re : [Résolu]Auto-incrémentation

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.

Hors ligne

#6 11/04/2014 18:08:23

Crackerz
Membre

Re : [Résolu]Auto-incrémentation

Merci tout est plus claire smile

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

#7 11/04/2014 22:50:19

gleu
Administrateur

Re : [Résolu]Auto-incrémentation

Oui, seul un trigger peut gérer ça.


Guillaume.

Hors ligne

#8 11/04/2014 23:47:10

Crackerz
Membre

Re : [Résolu]Auto-incrémentation

Ok, merci wink

Hors ligne

Pied de page des forums