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 09/09/2010 18:52:48

Alain V.
Membre

[débutant] Séquence ou identifiant?

Bonjour le forum,

Une séquence avec incréments me facilite la création d'identifiants incrémentés.

CREATE SEQUENCE masequence START 10 INCREMENT BY 10;

CREATE TABLE matable (
noid int4 DEFAULT nextval('masequence') UNIQUE,
colonne char(4)
);

Mais je ne sais pas assurer une protection contre ce genre d'insertion hors incréments;

INSERT INTO matable (noid, colonne) VALUES (3,3);

Il est aussi possible de réutiliser un identifiant identique à celui d'un autre ayant été précédemment détruit.

SELECT noid, colonne FROM matable WHERE noid=3;

 noid | colonne
------+---------
    3 | 3

DELETE FROM matable WHERE noid=3;
INSERT INTO matable (noid, colonne) VALUES (3,0);

Comment interdire ces deux possibiilités :
- je veux interdire l'utilisation d'un identifiant qui n'est pas dans la progression de la séquence
- je veux interdire de recréer un identifiant ayant déjà été détruit

Dans mon apprentissage de Postgres je n'ai pas encore abordé les fonctions ni d'autres outils plus élaborés.
Est-ce dans cette direction que je dois chercher?

Merci par avance pour vos conseils.

Hors ligne

#2 09/09/2010 19:20:16

gleu
Administrateur

Re : [débutant] Séquence ou identifiant?

Le seul moyen que je vois serait d'insérer l'identifiant dans une autre table (en plus de la table normale) et de vérifier à chaque insertion que l'identifiant n'est pas dans cette table. Sûr que ce n'est pas avec ça que vous allez avoir des performances.

Pourquoi avez-vous besoin d'interdire la réutilisation d'un identifiant issue d'une séquence ? les séquences ne sont pas faites pour ça en fait.


Guillaume.

Hors ligne

#3 09/09/2010 19:38:14

Marc Cousin
Membre

Re : [débutant] Séquence ou identifiant?

Peut-être qu'il y a une autre solution (je ne l'ai pas testée): vérifier currval() de la séquence à chaque mise à jour du champ (dans un trigger donc)
De là on a plusieurs cas :
- currval retourne une erreur. Dans ce cas, cela veut dire qu'on n'est pas passé par la séquence => Erreur
- currval n'est pas la valeur qu'on insère => Erreur
- currval = la valeur mise dans la table. On accepte la mise à jour


Marc.

Hors ligne

#4 09/09/2010 20:08:57

Alain V.
Membre

Re : [débutant] Séquence ou identifiant?

gleu a écrit :

Pourquoi avez-vous besoin d'interdire la réutilisation d'un identifiant issue d'une séquence ? les séquences ne sont pas faites pour ça en fait.

Je veux interdire la réutilisation d'un identifiant qu'il soit issu d'une séquence ou de n'importe quelle autre méthode.
La séquence ne m'est utile que pour me simplifier la création d'identifiants structurés.

Exemple d'utilisation :
- Un badge numéroté est délivré à l'entrée d'un parking. Il est détruit à la sortie. Son identifiant ne doit plus jamais être créé sinon on faussera le traçage de ce badge.

Peut-être que ma question est mal formulée.
Il y a l'idée de mettre l'identiant dans une autre table. On peut aussi ajouter une colonne qui indique l'état détruit ou pas. Mais je ne sais pas comment supprimer le risque de l'insert d'identifiants hors séquence.

Dernière modification par Alain V. (09/09/2010 20:33:02)

Hors ligne

#5 09/09/2010 21:07:22

gleu
Administrateur

Re : [débutant] Séquence ou identifiant?

À mon avis, l'objet séquence tel que proposé par PostgreSQL ne correspond pas à votre besoin.


Guillaume.

Hors ligne

#6 09/09/2010 21:40:27

Alain V.
Membre

Re : [débutant] Séquence ou identifiant?

Je vais continuer à chercher. Peut-être vais-trouver un objet identifiant ou une méthode pour gérer de simples numéros que moi je baptise : identifiants et pour lesquels l'objet séquence de Postgres ne me sert qu'à me faciliter la création au sein d'une progression arithmétique.

Merci beaucoup à vous deux. Je garde vos idées.

Hors ligne

#7 15/09/2010 10:42:53

Re : [débutant] Séquence ou identifiant?

Moi je ferais un trigger qui empêche l'insertion/modification de la colonne NOID.

Hors ligne

Pied de page des forums