samedi 4 avril 2009

Définir une séquence PostgreSQL

Une demande qui arrive souvent de la part des clients qui ont un système de commandes, de soumissions ou de facturation est de pouvoir débuter la numérotation des demandes à un nombre précis. Habituellement, c'est soit que le commerçant avait un ancien système et qu'il souhaite poursuivre la numérotation au numéro actuel pour conserver la continuité séquentielle, sinon c'est qu'il veut faire croire que son système est plus populaire qu'il l'est en réalité. Son premier client pourra alors avoir l'entrée 1000 plutôt que la numéro 1.

Ça peut se faire facilement si on prend pour acquis que le numéro correspondra à la séquence de la clé primaire de la table.

Création d'une table de commandes (simplifiée)
CREATE TABLE command
(
command_id integer NOT NULL,
client_name varchar(100) NOT NULL,
...
);
Définition de la clé primaire

Si vous avez défini command_id en utilisant le type integer plutôt que serial, vous devrez définir la clé primaire explicitement en ajoutant une contrainte (plus de détails sur le type SERIAL de PostgreSQL).
ALTER TABLE command
ADD CONSTRAINT pk_command_id
PRIMARY KEY (command_id);
À ce stade-ci, si vous essayez de faire une insertion dans la table, la base de données lancera un message d'erreur car aucune séquence n'a été définie.
INSERT INTO command (client_name)
VALUES ('Sun Microsystems');
ERROR: null value in column "command_id" violates not-null constraint

Création de la séquence

Comme on veut obtenir un numéro incrémentiel pour chaque commande ajoutée, on doit définir un objet qu'on appelle une séquence. Celle-ci se caractérise par un nom (command_id_seq) auquel on pourra référer plus tard dans notre programmation. De plus, on indique la valeur la plus basse que peut porter un numéro de commande (souvent 1, mais dans notre cas 1000), la valeur de départ pour la numérotation et l'incrémentation (chaque insertion créera un numéro unique avec un saut de 1 par rapport à la valeur précédente). Normalement, la valeur maximale sera définie automatiquement à 9223372036854775807.
CREATE SEQUENCE command_id_seq
MINVALUE 1000
START 1000
INCREMENT 1;
Si la séquence existe déjà et qu'on veut seulement changer la valeur de départ :
ALTER SEQUENCE command_id_seq
MINVALUE 1000
START 1000
INCREMENT 1;
Ce n'est pas tout, il faut aussi attacher cette séquence à la clé primaire si on veut que la valeur de command_id soit attribuée automatiquement :
ALTER TABLE command
ALTER COLUMN command_id
SET DEFAULT nextval('command_id_seq');
C'est fait. Les prochaines insertions utiliseront les valeurs 1000 et suivantes.

1 commentaire: