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 08/06/2011 11:11:38

Amelie_D
Membre

Récupérer l'ID dernier enregistrement

Bonjour,

voilà mon petit souci...

J'ai une table "doc" (id_doc, titre, auteur), clé primaire id_doc de type serial,
et une table "moclé" (id_doc, moclé), clé primaire id_doc (integer) + moclé.

Pour remplir la table moclé, j'ai besoin de récupérer l'id_doc du dernier objet enregistré.
J'ai essayé les 3 méthodes que j'ai trouvé sur le net :

$sql = pg_query("INSERT INTO doc (titre_doc, auteur) VALUES ('$titre', '$auteur') RETURNING id_doc");
$insert = pg_query("INSERT INTO moclé (id_doc, moclé) VALUES ($sql, $moclé)");

> La requête $sql échoue.

pg_query("INSERT INTO moclé (id_doc, moclé) VALUES (currval(doc_id_doc_seq), $moclé)");

> Pareil, la requête échoue.

$sql = pg_query("SELECT * FROM doc ORDER BY 'id_doc' DESC 1");
$insert = pg_query("INSERT INTO moclé (id_doc, moclé) VALUES (", $sql['id_doc'], "$moclé)");

> Rien ne se passe, la requête est acceptée mais ne renvoie rien.
Si je trie par titre, par contre (ORDER BY 'titre_doc'), ça marche, et je peux récupérer l'ID du document correspondant.
Sauf que le dernier titre ne correspond pas forcément au dernier enregistrement...

Je précise que j'ai essayé en restant connectée à la BD, et en déconnectant et reconnectant entre les 2 étapes (sauf pour le RETURNING).

Est-ce que quelqu'un aurait une correction ou une autre requête à proposer ?

amélie

Hors ligne

#2 08/06/2011 11:30:27

flo
Membre

Re : Récupérer l'ID dernier enregistrement

c'est titre, ou titre_doc, le nom de la colonne?
Sinon, quelle sont les erreurs que vous obtenez? (je ne  comprends pas ce que veut dire "la requête échoue")

Hors ligne

#3 08/06/2011 11:38:46

Marc Cousin
Membre

Re : Récupérer l'ID dernier enregistrement

C'est normal que les pg_query avec RETURNING échouent: cette méthode n'est pas capable de récupérer des enregistrements. Il faut effectuer un pg_fetch_row derrière le pg_query, pour récupérer l'enregistrement retourné.


Marc.

Hors ligne

#4 08/06/2011 11:40:13

Amelie_D
Membre

Re : Récupérer l'ID dernier enregistrement

Le nom de la colonne c'est titre_doc, j'ai voulu simplifier pour l'exemple...
Et quand je dis que la requête échoue, c'est en vérifiant avec
if (!$sql) { echo "erreur"; }

Hors ligne

#5 08/06/2011 11:50:57

Amelie_D
Membre

Re : Récupérer l'ID dernier enregistrement

J'ai essayé le pg_fetch_row après le returning.
Mais...

$sql = pg_query("INSERT INTO doc (titre_doc, auteur) VALUES ($titre, $auteur) RETURNING titre_doc");
if (!sql) { echo "erreur"; }
$lire = pg_fetch_row($sql);
echo "Titre = $lire[0]";

Ca affiche bien le titre du doc enregistré, par contre

$sql = pg_query("INSERT INTO doc (titre_doc, auteur) VALUES ($titre, $auteur) RETURNING id_doc");
if (!sql) { echo "erreur"; }
$lire = pg_fetch_row($sql);
echo "Id = $lire[0]";

Ca m'affiche "erreur".

Y a-t-il une méthode pour avoir un message d'erreur détaillé ?

Hors ligne

#6 08/06/2011 11:52:16

Marc Cousin
Membre

Re : Récupérer l'ID dernier enregistrement

Pouvez-vous essayer d'exécuter l'INSERT RETURNING id_doc dans une session psql ?


Marc.

Hors ligne

#7 08/06/2011 12:14:44

Amelie_D
Membre

Re : Récupérer l'ID dernier enregistrement

Dans une session psql, j'obtiens
"ERREUR : la colonne "id_doc" n'existe pas".

Hors ligne

#8 08/06/2011 13:46:48

Marc Cousin
Membre

Re : Récupérer l'ID dernier enregistrement

Êtes-vous vraiment sûre d'avoir une colonne id_doc dans la table doc ?
Pouvez-vous, toujours dans psql, exécuter:
\d doc

?


Marc.

Hors ligne

#9 08/06/2011 14:14:43

Amelie_D
Membre

Re : Récupérer l'ID dernier enregistrement

Oui oui, \d doc me liste bien toutes les colonnes :

                                        Table « public.doc »
   Colonne    |          Type                     |                          Modificateurs                           
--------------+-----------------------------+------------------------------------------------------------------
Id_doc       | integer                           | non NULL Par défaut, nextval('"documents_Id_doc_seq"'::regclass)
auteur        | text                                | non NULL
titre_doc    | character varying(200) | non NULL

Index :
    "documents_pkey" PRIMARY KEY, btree ("Id_doc")

Hors ligne

#10 08/06/2011 14:17:01

Marc Cousin
Membre

Re : Récupérer l'ID dernier enregistrement

Vous avez un I majuscule au nom de la colonne. PostgreSQL passe tout en minuscule, sauf si, explicitement, vous mettez les nom des objets entre " ".

INSERT INTO doc (titre_doc, auteur) VALUES ($titre, $auteur) RETURNING "Id_doc" devrait marcher. Mais je vous recommande plutôt de changer le nom de la colonne et de vous débarrasser de ce I majuscule.

Dernière modification par Marc Cousin (08/06/2011 14:17:14)


Marc.

Hors ligne

#11 08/06/2011 14:47:03

Amelie_D
Membre

Re : Récupérer l'ID dernier enregistrement

En effet,

dans ma table la colonne s'appelait "Id_doc", et pour l'exemple je l'avais remplacé par "id_doc"... sans penser que ça pouvait avoir une influence, puisque je faisais attention à bien mettre la majuscule partout dans mon script ! Encore une erreur bête de débutante...

Bon, du coup j'ai enlevé toutes les majuscules de mes noms de champs, et maintenant le RETURNING + pg_fetch_row ça marche !

Merci beaucoup,


amélie

Hors ligne

Pied de page des forums