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 :

UPDATE error


Sujet :

PostgreSQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 89
    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$

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 209
    Par défaut
    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+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 89
    Par défaut
    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.....

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    Je crois que la virgule est en trop juste avant le from

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    Je crois que la virgule est en trop juste avant le from

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    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++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 89
    Par défaut
    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$

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 209
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    select currval('masequence');
    A+

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    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++

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 89
    Par défaut
    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???

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 89
    Par défaut
    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....

  12. #12
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    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

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 89
    Par défaut
    oui c'est ce que j'ai mis au début et en fait il m'a retourné:

    ERROR: Column reference "numero" is ambiguous

  14. #14
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    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++

  15. #15
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    essaye d.numero=d.numero+1

  16. #16
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    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;

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 89
    Par défaut
    et non il me met à chaque fois:

    ERROR: parser: parse error at or near "." at character 50

  18. #18
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    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;

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 89
    Par défaut
    oui moi aussi ca m'echappe à vrai dire

    non ca ne passe pas il rejette le AS rajouté....

  20. #20
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    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é

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [MySQL] UPDATE: ERROR DUPLICATE ENTRY FOR KEY PRIMARY
    Par Blackcocktail dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/12/2011, 15h07
  2. update error code 1093 .. vois pas pourquoi
    Par maysa dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/10/2009, 11h55
  3. ERROR: insert or update on table "ecole" violate
    Par doulel dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 17/04/2006, 21h24
  4. [VBA][recordset]pb update error 3061 too few parameters
    Par megapacman dans le forum Access
    Réponses: 2
    Dernier message: 23/03/2006, 16h11
  5. ALTER TABLE : ERROR Unsuccessfull metadata update...
    Par shashark dans le forum Bases de données
    Réponses: 6
    Dernier message: 28/06/2005, 15h27

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