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 20/04/2004, 18h22   #1
Membre du Club
 
Inscription : mars 2004
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 89
Points : 59
Points : 59
Par défaut UPDATE error

Bonjour à tous,

je suis relativement nouveau sur postgre et je retse bloqué sur une chose qui est certainement toute bête Il s'agit d'un UPDATE qui doit incrémenter le champs "numero" de 1 de la table "deposants_tbl" mais celon quelques condtions qui sont décrites dans mon where.

Voila le code que j'execute:

UPDATE ONLY deposants_tbl
SET numero = numero+1,
FROM deposants_tbl AS d, articles_tbl AS a
WHERE a.oid= MAX (oid) AND
a.id_deposant=d.id_deposant;


Voici mon erreur:

ERROR: parser: parse error at or near "FROM" at character 55


J'ai essayé d'enlever les "AS" mais cela n'a rien changé...

Merci d'avance de votre précieuse aide

$GRM$
$grm$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 07h43   #2
Membre actif
 
Inscription : juin 2003
Messages : 209
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 209
Points : 189
Points : 189
Salut,

Mais tu ne peux pas utiliser l'aggrégat MAX dans une clause where! Que veux-tu exprimer par a.oid = MAX(oid)?

A+
Bouboubou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 10h11   #3
Membre du Club
 
Inscription : mars 2004
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 89
Points : 59
Points : 59
AH, chose que je ne savais pas merci, en fait par MAX (oid) je voulais avoir le dernier enregistrement rentré dans la table articles_tbl. Mais si on ne peux pas utiliser MAX comment peux-t-on faire pour avoir donc le dernier enregistrement rentré?????

Je vais essayer de l'enlever pour voir si c'est ce qui empeche la requete de s'executer.....
$grm$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 10h24   #4
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
Je crois que la virgule est en trop juste avant le from
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 10h26   #5
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
Je crois que la virgule est en trop juste avant le from
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 10h31   #6
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
désolé pour l e double post
Pour ce qui est du max dans le where , il faudrait utilise

...
where a.oid=(select max(oid) from articles_tbl)

Mais il faudrait effectivement voir s'il n'y a pas une autre solution
Peut-être en ajoutant un champ datetime dans la table articles_tbl

A++
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 11h23   #7
Membre du Club
 
Inscription : mars 2004
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 89
Points : 59
Points : 59
Tout d'abord un grand merci de prendre le temps de me répondre,

donc en effet il n'y pas la virgule:

UPDATE ONLY deposants_tbl
SET numero='numero+1'
FROM deposants_tbl AS d, articles_tbl AS a
WHERE a.oid=(select max(oid) from articles_tbl) AND
a.id_deposant=d.id_deposant;

La requete s'excecute parfaitement merci bien à tous les deux

$GRM$
$grm$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 11h38   #8
Membre actif
 
Inscription : juin 2003
Messages : 209
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 209
Points : 189
Points : 189
Salut,

GeantVert13 a raison, tu es obligé d'utiliser une sous-requête. Mais si ton oid est une clé primaire qui utilise une séquence. Tu peux utiliser le code suivant qui est plus performant que de parcourir tout ton index voir ta table.

Code :
SELECT currval('masequence');
A+
Bouboubou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 11h51   #9
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
Je suis assez nouveau sur postgresql, mais je crois que le champ oid est le champ créé par défaut dans une table créée avec WITH OID (équivalent de ROWID sous ORACLE).
Je pense qu'utilser ce champ dans une requête est assez aléatoire (je ne sait pas si max(OID) est forcément le dernier élément enregistré. C'est pourquoi il vaut peut-être mieux utilisé une séquence comme indiqué par bouboubou. Ou alors ajouter un champ date_création de type timedate avec comme propiété 'default now()'. ainsi à chaque fois qu'une ligne est insérée, ce champ sera renseigné avec la date et l'heure actuelle.
S'il n'y a pas d'autre utilité pour la date, il vaut mieux utiliser la méthode de bouboubou.

A++
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 11h54   #10
Membre du Club
 
Inscription : mars 2004
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 89
Points : 59
Points : 59
Mais ton OID est géré en auto, c'est intraseque a la base si je ne me trompe donc tu ne peux pas le mettre comme clé primaire ou le rattacher à une séquence, si?

En fait il me reste une erreur!!! C'est la gestion de l'auto-incrementation dans "numerique", voila ce qu'il me retourne:

ERROR: pg_atoi: error in "numero+1": can't parse "numero+1"

je ne comprends pas car dans l'aide c'est marqué comme tel:

UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT

Et moi je mets : numeric='numeric+1'....
Mais où est l'erreur????

Sinon excuse mon niveau modeste mais qu'est le "currval" exactement???
$grm$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 12h00   #11
Membre du Club
 
Inscription : mars 2004
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 89
Points : 59
Points : 59
Mais l'OID est incrémenté par le systeme donc si je prends max ca devrait le faire non???Ou alors ferais-je mieux d'autoincrementer un champ avec une sequence et d'uitliser la methode de BOUBOU???? Car c'est vrai que je ne vais pas pouvoir appeller de sequence si j'utilise l'OID du coup....
$grm$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 12h01   #12
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
si numero est du type numérique il ne faut pas mettre de cote :
set numero=numero+1 et pas
numero='numero+1' <-- ceci est une chaine de caractères pas un numérique
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 12h04   #13
Membre du Club
 
Inscription : mars 2004
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 89
Points : 59
Points : 59
oui c'est ce que j'ai mis au début et en fait il m'a retourné:

ERROR: Column reference "numero" is ambiguous
$grm$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 12h06   #14
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
Citation:
Envoyé par $grm$
Mais l'OID est incrémenté par le systeme donc si je prends max ca devrait le faire non???Ou alors ferais-je mieux d'autoincrementer un champ avec une sequence et d'uitliser la methode de BOUBOU???? Car c'est vrai que je ne vais pas pouvoir appeller de sequence si j'utilise l'OID du coup....
En effet la méthode de bouboubou sera beaucoup plus efficace !
OID est effectivement gérée par le système mais je ne sait pas si, dans le cas d'une suppression d'un enregistrement par exemple, l'OID est réutilisé. En outre si le nombre d'enregistrements devient énorme (vrai ment énorme) l'unicité d'OID n'est plus vérifiée

A++
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 12h07   #15
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
essaye d.numero=d.numero+1
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 12h10   #16
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
NON j'ai dit une bêtise
essaye plutot

UPDATE ONLY deposants_tbl
SET deposants_tbl.numero = deposants_tbl.numero+1,
FROM deposants_tbl AS d, articles_tbl AS a
WHERE a.oid= MAX (oid) AND
a.id_deposant=d.id_deposant;
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 12h19   #17
Membre du Club
 
Inscription : mars 2004
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 89
Points : 59
Points : 59
et non il me met à chaque fois:

ERROR: parser: parse error at or near "." at character 50
$grm$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 12h21   #18
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
Décidément il ya un truc qui m'échappe, je ne peut pas faire l'essai car je ne suis pas chez moi mais peux tu essayer ça :

UPDATE ONLY deposants_tbl AS d
SET d.numero=d.numero+1
FROM articles_tbl AS a
WHERE a.oid=(select max(oid) from articles_tbl) AND
a.id_deposant=d.id_deposant;
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 12h28   #19
Membre du Club
 
Inscription : mars 2004
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 89
Points : 59
Points : 59
oui moi aussi ca m'echappe à vrai dire

non ca ne passe pas il rejette le AS rajouté....
$grm$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 12h47   #20
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
En fait je crois qu'il y a une erreur plus grave :
Le numéro doit-il être incrémenté dans tous les cas, car tel que je vois les choses, ton update ne marchera que si le select max(oid) renvoie loid d'un enregistrement qui contient le bon id_deposant.

si l'update doit marcher pour n'impote quel id_deposant je pense qu'il faut revoir la requete

essaye

update only deposant_tbl
set numero=numero+1
from article_tbl as a
where a.id_deposant=deposant_tbl.id_deposant
and a.oid=(select max(oid) from articles_tbl as a1
where a1.id_deposant=deposant_tbl.id_deposant)

Je ne peut pas du tout tester, donc j'envoie un peut les trucs à l'aveugle désolé
GeantVert13 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 08h57.


 
 
 
 
Partenaires

Hébergement Web