IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Besoin conseil pour gérer SERIAL


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut Besoin conseil pour gérer SERIAL
    Bonjour,

    J'aurais donc besoin d'un petit conseil :

    J'ai une table qui est du style :

    ma_table
    id SERIAL,
    nom TEXT UNIQUE NOT NULL

    J'ai remarqué que si un INSERT de nom échoue, l'id est tout de même incrémenté (du coup j'ai des gaps énormes entre 2 valeurs). Comment me conseilleriez-vous de gérer ceci ?

    Je pense soit :

    - gestion par la base: trigger avec fonction trigger mais je ne crois pas pouvoir interrompre un INSERT, et je ne peux pas agir sur la valeur d'un SERIAL (heureusement )

    - par script: une fonction qui me renverrait un booléen selon l'existence du nom et je n'effectuerai l'INSERT que dans le cas de non existence

    En vous remerciant,

    C. Tobini

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 143
    Points
    143
    Par défaut
    En quoi le gap entre deux valeurs d'une même séquence est un problème ?

    Sinon, pour le reste :

    gestion par la base: trigger avec fonction trigger mais je ne crois pas pouvoir interrompre un INSERT, et je ne peux pas agir sur la valeur d'un SERIAL (heureusement )
    Interrompre un INSERT est possible et vous pouvez agir sur un SERIAL. Je ne vois pas le rapport avec le problème du gap, mais ce sont des fonctionnalités disponibles.

    par script: une fonction qui me renverrait un booléen selon l'existence du nom et je n'effectuerai l'INSERT que dans le cas de non existence
    Il serait plus simple dans ce cas de faire une fonction qui réaliserait tout ça. Une fonction du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 1 FROM ma_table WHERE nom='le nom à insérer donné en variable à la fonction';
    IF NOT FOUND
    THEN
      INSERT INTO ma_table (nom) VALUES ('le nom à insérer donné en variable à la fonction');
    END IF

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour et merci de la réponse,

    Le gap n'est pas un problème. Mais un saut de 6 000 000 entre 2 entrées (surtout qu'il n'y en a que 10), je trouve ça assez peu élégant.

    Interrompre un INSERT est possible et vous pouvez agir sur un SERIAL
    C'est à dire que je peux, sur un trigger BEFORE INSERT arrêter l'INSERT ?

    Pour le SERIAL, je préfère laisser gérer le système et ne pas trop jouer avec les séquences, elles sont là pour ça.

    Pour la fonction c'est quelque chose comme ça que je voyais, appeler une fonction SQL via le script. J'aimerais bien néanmois gérer si c'est possible par trigger, avant insertion.

    C. Tobini

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 143
    Points
    143
    Par défaut
    Un saut de 6000000 entre deux INSERT me paraît énorme. De quatre/cinq, je veux bien. De 6000000, j'ai un doute. Quel est le pas de ce trigger ? le meilleur moyen de le savoir est de lancer la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT increment_by FROM la_sequence;
    Pour l'annulation d'un trigger INSERT, oui, c'est possible. Il faut que le trigger soit de niveau ligne (et non pas instruction) et que ce soit un trigger BEFORE. Il convient simplement de renvoyer NULL pour que l'opération soit annulée. Ceci est aussi vrai pour un trigger UPDATE.

    Pour la fonction, c'était du PL/pgsql, donc pas forcément supportée sur la base utilisée.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Un saut de 6000000 entre deux INSERT me paraît énorme...
    Oui, j'ai fait du ligne à ligne sur 10 fichiers de 6 000 000 de lignes en injectant le nom du fichier à chaque ligne au lieu de le faire en début de code (précipitation)... c'est ballot, mais maintenant que j'ai intégré les 60 000 000 de données, je ne vais pas relancer

    Pour l'annulation d'un trigger INSERT, oui, c'est possible. Il faut que le trigger soit de niveau ligne (et non pas instruction) et que ce soit un trigger BEFORE. Il convient simplement de renvoyer NULL pour que l'opération soit annulée.
    Je vais tester, c'est juste un RETURN NULL qui annule l'insertion sur un trigger FOR EACH ROW à ce moment ?

    C. Tobini

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 143
    Points
    143
    Par défaut
    En fait, la ligne renvoyée est la ligne insérée. Dans le cas où la procédure trigger renvoit NULL, cela annule l'opération (donc l'insertion).

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    OK merci, je vais tester cette solution !

    Bon week-end,

    C. Tobini

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Info] Conseils pour gérer les ressources
    Par calogerogigante dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 05/07/2009, 12h49
  2. Besoin conseils pour candidature spontanée
    Par vallica dans le forum Emploi
    Réponses: 7
    Dernier message: 05/10/2006, 16h10
  3. [MySQL] conseils pour gérer des images avec mysql
    Par briiice dans le forum Administration
    Réponses: 9
    Dernier message: 04/01/2006, 09h52
  4. Réponses: 5
    Dernier message: 25/07/2005, 10h17
  5. [EJB Session] Besoin conseil pour implémentation
    Par stago dans le forum Java EE
    Réponses: 10
    Dernier message: 13/07/2004, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo