|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 89 ![]() |
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$ |
|
|
00
|
|
|
#2 |
|
Membre actif
![]() Inscription : juin 2003 Messages : 209 ![]() |
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+ |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 89 ![]() |
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..... |
|
|
00
|
|
|
#4 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
Je crois que la virgule est en trop juste avant le from
|
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
Je crois que la virgule est en trop juste avant le from
|
|
|
00
|
|
|
#6 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
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++ |
|
|
00
|
|
|
#7 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 89 ![]() |
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$ |
|
|
00
|
|
|
#8 |
|
Membre actif
![]() Inscription : juin 2003 Messages : 209 ![]() |
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. A+ |
|
|
00
|
|
|
#9 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
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++ |
|
|
00
|
|
|
#10 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 89 ![]() |
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??? |
|
|
00
|
|
|
#11 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 89 ![]() |
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....
|
|
|
00
|
|
|
#12 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
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 |
|
|
00
|
|
|
#13 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 89 ![]() |
oui c'est ce que j'ai mis au début et en fait il m'a retourné:
ERROR: Column reference "numero" is ambiguous |
|
|
00
|
|
|
#14 | |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
Citation:
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++ |
|
|
|
00
|
|
|
#15 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
essaye d.numero=d.numero+1
|
|
|
00
|
|
|
#16 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
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; |
|
|
00
|
|
|
#17 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 89 ![]() |
et non il me met à chaque fois:
ERROR: parser: parse error at or near "." at character 50 |
|
|
00
|
|
|
#18 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
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; |
|
|
00
|
|
|
#19 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 89 ![]() |
oui moi aussi ca m'echappe à vrai dire
non ca ne passe pas il rejette le AS rajouté.... |
|
|
00
|
|
|
#20 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
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é |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com