Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/06/2007, 14h45   #1
Nouveau Membre du Club
 
Avatar de bambou
 
Inscription : mars 2004
Messages : 192
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mars 2004
Messages : 192
Points : 36
Points : 36
Envoyer un message via AIM à bambou Envoyer un message via MSN à bambou Envoyer un message via Skype™ à bambou
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
bambou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2007, 18h30   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 422
Points : 6 422
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
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2007, 02h06   #3
Nouveau Membre du Club
 
Avatar de bambou
 
Inscription : mars 2004
Messages : 192
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mars 2004
Messages : 192
Points : 36
Points : 36
Envoyer un message via AIM à bambou Envoyer un message via MSN à bambou Envoyer un message via Skype™ à bambou
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
bambou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2007, 17h03   #4
Membre émérite
 
Inscription : mai 2002
Messages : 727
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 727
Points : 982
Points : 982
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
__________________

Smortex

Les FAQ Assembleur - Linux
In The Beginning Was The Command Line Neal Stephenson
Smortex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 13h50   #5
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
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 :
1
2
3
INSERT INTO jour(
             madate, lib_jourferie)
    VALUES ( now(), 'aujourdhui') RETURNING id_jour;
A+
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 17h20   #6
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2007, 11h00   #7
Nouveau Membre du Club
 
Avatar de bambou
 
Inscription : mars 2004
Messages : 192
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mars 2004
Messages : 192
Points : 36
Points : 36
Envoyer un message via AIM à bambou Envoyer un message via MSN à bambou Envoyer un message via Skype™ à bambou
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
bambou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2007, 22h36   #8
jnore
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
L'aggrégat 'RETURNING' est vraiment intéressant. Le problème est si l'on veut migrer vers un autre SGBD, ça ne sera pas interprété !!
La ou les requetes seront bonnes à refaire!
  Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2007, 23h42   #9
Nouveau Membre du Club
 
Avatar de bambou
 
Inscription : mars 2004
Messages : 192
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mars 2004
Messages : 192
Points : 36
Points : 36
Envoyer un message via AIM à bambou Envoyer un message via MSN à bambou Envoyer un message via Skype™ à bambou
dans mon cas précis ça ne pose pas de probleme il est possible qu'il y ait migration des données vers une autre architecture de la base, mais le moteur restera posgres, donc le returning me convient parfaitement
bambou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 01h07   #10
Membre régulier
 
Inscription : juin 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 52
Points : 80
Points : 80
Envoyer un message via ICQ à Shepard Envoyer un message via MSN à Shepard
Euh est-ce que la fonction nextval() ne sert pas précisément à ce genre de situation ?

Je veux dire: On commence par

Code :
SELECT NEXTVAL('sequence');
puis:

Code :
INSERT INTO TABLE ( id, col2, col3, ... ) VALUES ( [résultat de la requête du dessus], val2, val3, ... );
Enfin moi c'est comme ça que je fais ^^ Pas d'extension supplémentaire nécessaire, on est absolument certain de ne pas "mélanger" les id, c'est simple, beau, rapide, cool, bien, chouette ^^

Dites moi si je me trompe svp
Shepard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 09h57   #11
Nouveau Membre du Club
 
Avatar de bambou
 
Inscription : mars 2004
Messages : 192
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mars 2004
Messages : 192
Points : 36
Points : 36
Envoyer un message via AIM à bambou Envoyer un message via MSN à bambou Envoyer un message via Skype™ à bambou
Pour recadrer un peu les choses : mon but était d'essayer de diminuer le nombre de requetes, passer de 3 à 2 :
- Un select pour vérifier l'existance du tupple
- Un insert pour inserer le tupple
- Un select pour récupérer l'identifiant

pour la derniere requete que je fasse un select classique ou un SELECT NEXTVAL('sequence');, cela ne change rien, j'ai toujours 3 requetes...

...alors qu'avec le returning, la 3eme requete n'est plus nécessaire.

J'aurais été en php5 j'aurais pu tout faire avec une seule requete, mais malheuresement ce n'est pas le cas :'(
bambou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2007, 09h54   #12
Membre régulier
 
Inscription : juin 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 52
Points : 80
Points : 80
Envoyer un message via ICQ à Shepard Envoyer un message via MSN à Shepard
En effet ça ne change rien du point de vue du nombre de requêtes, j'avais pas compris le débat désolé
Shepard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2007, 16h29   #13
Membre émérite
 
Inscription : mai 2002
Messages : 727
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 727
Points : 982
Points : 982
Citation:
Envoyé par Shepard
Euh est-ce que la fonction nextval() ne sert pas précisément à ce genre de situation ?

[couic]
C'est moins lourd que de refaire une sélection sur tous les champs après, et comme le champ est indexé, la recherche est simplifiée. Tu perds juste la flexibilité offerte en mettant une valeur par défaut pour ce champ et le laisser gérer par PostgreSQL. Donc si tu es dans une situation telle que celle décrite par GrandFather, je pense qu'il est encore plus simple de faire un SELECT sur currval() après l'insertion.

Citation:
Envoyé par bambou
J'aurais été en php5 j'aurais pu tout faire avec une seule requete, mais malheuresement ce n'est pas le cas :'(
Il me semblais que le moteur magique qui accède à la base de données en exécutant seulement une requète sur deux est prévu dans PHP 7.0 seulement (Les goto de PHP 6.0 étants requis pour implémenter cette extension)...
__________________

Smortex

Les FAQ Assembleur - Linux
In The Beginning Was The Command Line Neal Stephenson
Smortex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2007, 17h39   #14
Nouveau Membre du Club
 
Avatar de bambou
 
Inscription : mars 2004
Messages : 192
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mars 2004
Messages : 192
Points : 36
Points : 36
Envoyer un message via AIM à bambou Envoyer un message via MSN à bambou Envoyer un message via Skype™ à bambou
Citation:
Envoyé par Smortex
Il me semblais que le moteur magique qui accède à la base de données en exécutant seulement une requète sur deux est prévu dans PHP 7.0 seulement (Les goto de PHP 6.0 étants requis pour implémenter cette extension)...
rhooo c'est pas gentil de ce moquer des noobs qui s'exprime mal!! vilain canaillou va

non ce que j'entendais par par
Citation:
J'aurais été en php5 j'aurais pu tout faire avec une seule requete, mais malheuresement ce n'est pas le cas :'(
c'est qu'avec un try/catch...imlémenté dans php5...j'aurais pu faire l'insert directement et récupérer l'erreur, si erreur il y avait. le 'tout' désignait les 2 premieres requetes (a savoir, rechercher l'existance du tupple et l'inserer si il n'existe pas), ce qui effectivement n'était pas trés bien formulé, je le reconnais

mais au final 2 requetes sont nécessaires, on est d'accord
bambou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2010, 17h42   #15
Modérateur
 
Avatar de TheGzD
 
Homme Geoffrey Garcia
Ingénieur R&D / Doctorant
Inscription : avril 2007
Messages : 1 126
Détails du profil
Informations personnelles :
Nom : Homme Geoffrey Garcia
Âge : 30
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Ingénieur R&D / Doctorant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2007
Messages : 1 126
Points : 1 578
Points : 1 578
Envoyer un message via MSN à TheGzD
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.
__________________
Vous postez du code ? Merci d'utiliser les balises [CODE] ... [/CODE]
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag

[ En cas de besoin retrouvez moi sur l'AnoChat ]
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Doctorant à l'EDSPI de Clermont-Ferrand, depuis 2011.
TheGzD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2010, 13h02   #16
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 793
Points : 17 793
Citation:
Envoyé par bambou Voir le message
Pour recadrer un peu les choses : mon but était d'essayer de diminuer le nombre de requetes, passer de 3 à 2 :
- Un select pour vérifier l'existance du tupple
- Un insert pour inserer le tupple
- Un select pour récupérer l'identifiant
Là vous faites fausse route complète !!!!

1) entre la requête 1 et la 2 les données peuvent changer du fait des actions concurrentes des utilisateurs. Le risque est donc énorme d'obtenir une incohérence de la base de données tôt ou tard.... et je vous renvoie sur le commentaire précédent : http://www.developpez.net/forums/d36...e/#post2256364 (loi de Murphy)

Le plus simple est d'incorporer la requête 1 dans la 2. Exemple :
Code :
1
2
INSERT INTO MaTable
WHERE ...
Ensuite compter le nombre de ligne insérées... ceci est faisable pour toute requête du côté client, comme du côté serveur !

Code :
1
2
3
4
5
6
DECLARE  
   nb_lignes integer;  
BEGIN  
   INSERT INTO ...
   GET DIAGNOSTICS nb_lignes := ROW_COUNT;  
   IF nb_lignes  = 0 ...
2) diminuer le nombre de requête n'est pas une fin en soi. Ce qui importe dans un SGBDR est de diminuer les temps de verrouillage d'un côté (serveur) et les aller retours de l'autre côté (client).
Dans ce sens l'utilisation des procédures stockées (Dans PostGreSQL ce sont des fonctions) ne peut que vous apporter des bienfaits et répondre aux deux problématiques....

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2010, 14h08   #17
Modérateur
 
Avatar de TheGzD
 
Homme Geoffrey Garcia
Ingénieur R&D / Doctorant
Inscription : avril 2007
Messages : 1 126
Détails du profil
Informations personnelles :
Nom : Homme Geoffrey Garcia
Âge : 30
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Ingénieur R&D / Doctorant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2007
Messages : 1 126
Points : 1 578
Points : 1 578
Envoyer un message via MSN à TheGzD
Pour répondre à la question initiale, je crois que la requête suivante doit renvoyé le résultat souhaité :
__________________
Vous postez du code ? Merci d'utiliser les balises [CODE] ... [/CODE]
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag

[ En cas de besoin retrouvez moi sur l'AnoChat ]
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Doctorant à l'EDSPI de Clermont-Ferrand, depuis 2011.
TheGzD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2010, 15h29   #18
Modérateur
 
Avatar de TheGzD
 
Homme Geoffrey Garcia
Ingénieur R&D / Doctorant
Inscription : avril 2007
Messages : 1 126
Détails du profil
Informations personnelles :
Nom : Homme Geoffrey Garcia
Âge : 30
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Ingénieur R&D / Doctorant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2007
Messages : 1 126
Points : 1 578
Points : 1 578
Envoyer un message via MSN à TheGzD
Je repasse en coup de vent pour confirmer que cette requête retourne effectivement le résultat souhaité
__________________
Vous postez du code ? Merci d'utiliser les balises [CODE] ... [/CODE]
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag

[ En cas de besoin retrouvez moi sur l'AnoChat ]
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Doctorant à l'EDSPI de Clermont-Ferrand, depuis 2011.
TheGzD est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h46.


 
 
 
 
Partenaires

Hébergement Web