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 :

Recuperer l'identifiant aprés insertion d'un tupple


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de bambou
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2004
    Messages : 192
    Par défaut Recuperer l'identifiant aprés insertion d'un tupple
    Bonjour,

    Je vien du forum PHP ou on m'a renvoyé par ici..

    Est-ce que quelqu'un saurait si il existe une fonction equivalente à MySQL mysql_insert_id() pour postgres?

    à savoir qui retournerai l'identifiant d'un tupple que l'on vient d'inserer sans avoir a passer une nouvelle requete?

    merci


    ps : le post relatif dans le forum php

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Bonjour,
    Dans Postgres, je ne crois pas qu'il y ait de fonction d'auto incrément comme dans MySQL. Les clefs peuvent être générées par des séquences.
    Donc, si tu as le nom de l'objet séquence utilisé sur ta table, l'instruction currval('nom_sequence') renvoit la dernière valeur employée par cette séquence.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre confirmé Avatar de bambou
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2004
    Messages : 192
    Par défaut
    l'instruction currval('nom_sequence') est une instruction SQL non?

    Si je veux l'utiliser il faut que je fasse une requete SQL..ça revient plus ou moin au meme que de refaire un select

  4. #4
    Membre Expert

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Par défaut
    Salut

    ced, ta méthode peut poser problème car l'INSERT et le SELECT qui suit ne sont pas effectués de façon atomique. Si une nouvelle ligne est insérée dans la table entre les deux instructions, le SELECT renverra la mauvaise valeur.

    Il ne reste que deux solutions:
    • Faire un SELECT en cherchant les valeurs qui viennent d'être insérées. Si ces valeurs sont uniques, pas de problème, sinon on peut avoir plusieurs lignes de résultat et là c'est un autre problème.
    • Utiliser l'extension non-standard de PostgreSQL 8.2+ RETURNING documentée ici : http://www.postgresql.org/docs/8.2/i...ql-insert.html

  5. #5
    Membre expérimenté Avatar de budtucker
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 176
    Par défaut
    Smortex, de spéculer qu'un insert puisse se produire entre un insert et un select (surtout sur une séquence) est un peu (beaucoup !!) improbable. A part si on bosse sur une application d'environ une centaine d'accès à la seconde !! Je crois que seul SourceForge.com peut se vanter de ça.

    Bien sûr, comme tu l'as indiqué, on peut également utiliser la forme suivante :

    J'ai une table jour avec id_jour en serial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO jour(
                 madate, lib_jourferie)
        VALUES ( now(), 'aujourdhui') RETURNING id_jour;
    A+

  6. #6
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par Smortex
    ced, ta méthode peut poser problème car l'INSERT et le SELECT qui suit ne sont pas effectués de façon atomique. Si une nouvelle ligne est insérée dans la table entre les deux instructions, le SELECT renverra la mauvaise valeur.
    L'INSERT et le SELECT ne sont effectivement pas atomiques, mais en l'occurrence cela n'a pas d'importance car currval() renverra le dernier numéro "consommé" dans la même session. Même si des sessions ouvertes par d'autres clients insèrent d'autres enregistrements entre l'INSERT et le SELECT, la cohérence de la valeur renvoyée par currval() est garantie pour la session qui l'appelle. Seule contrainte, il faut impérativement qu'un nextval() ait été appelé auparavant dans la même session, ce qui est le cas ici puisque l'insertion d'un enregistrement comportant un champ du type SERIAL déclenche automatiquement l'appel de cette fonction.

    budtucker >> compter sur la chance pour que la base conserve son intégrité est s'exposer tôt ou tard à un rappel douloureux de la Loi de Murphy...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  7. #7
    Membre confirmé Avatar de bambou
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2004
    Messages : 192
    Par défaut
    Merci beaucoup pour toutes ces réponses,

    je vais voir si il est possible de mettre en place l'extension returning sur la BD que j'utilise, ce serait l'ideal

    encore merci a vous tous

  8. #8
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Bonjour !

    Je me permets de faire remonter le sujet, car il n'a pas vraiment été apporté de réponse à la question initiale (dont la réponse m'intéresse (si si si sans déconner )) :

    Citation Envoyé par bambou Voir le message
    Est-ce que quelqu'un saurait si il existe une fonction equivalente à MySQL mysql_insert_id() pour postgres?
    Dans mon cas je dispose du PGresult * renvoyé par la dernière requête passée et forcément du PGconn * de ma connexion.

    S'il n'y a toujours pas d'autres moyens que ceux énoncés dans ce topic, je me résignerai, la mort dans l'âme, à truander

    Merci d'avance.

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

Discussions similaires

  1. recuperation de l'identifiant après insertion
    Par al-faddi dans le forum C#
    Réponses: 3
    Dernier message: 28/05/2015, 19h24
  2. Réponses: 5
    Dernier message: 30/07/2010, 20h33
  3. recuperer id SERIAL après INSERT INTO ?
    Par hicpalm dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 11/02/2008, 09h46
  4. recuperer Sequence Oracle après insert
    Par maxf1 dans le forum JDBC
    Réponses: 3
    Dernier message: 10/02/2007, 23h17
  5. Réponses: 11
    Dernier message: 26/07/2006, 14h35

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