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 :

Gérer une FK pointant sur une PK de type SERIAL [9.1]


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Ingénieure novice !
    Inscrit en
    Juin 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Ingénieure novice !
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 21
    Par défaut Gérer une FK pointant sur une PK de type SERIAL
    Bonjour à tous !

    Je m'en remets à vous, car malgré mes recherches, je reste bloquée face à un problème de clé étrangère pointant sur une clé primaire de type SERIAL !

    En fait voilà, rien ne vaut un exemple simplifié :

    J'ai une table projet dont la clé primaire id_projet est de type SERIAL.
    J'ai une table objet dont la clé primaire id_objet est de type SERIAL.
    Un projet contient plusieurs objets.
    Un objet peut appartenir à 1 ou plusieurs projets, ainsi j'ai une table supplémentaire Fait_partie_projet dont la clé primaire est faite de deux clés étrangères :
    id_projet INTEGER REFERENCES projet (id_projet)
    et :
    id_objet INTEGER REFERENCES objet (id_objet)

    Je connais la fonction currval() pour utiliser la valeur actuelle d'une séquence.
    Le fait est qu'il est tout à fait possible d'insérer un premier tuple dans projet, pour un projet x par exemple. Ensuite, de commencer à remplir les tables objet et fait_partie_projet dans lesquelles en effet je peux utiliser currval() pour récupérer la clé primaire de ma table projet. Mais ensuite, si un nouveau projet y est déclaré, faisant incrémenter la clé primaire, comment faire référence au projet x (ou n'importe quel autre projet inséré auparavant) dans ma table fait_partie_projet ?!
    J'ai bien pensé aussi à faire une fonction (en tant que débutante ceci est un peu obscure pour moi cependant) en utilisant un "RETURNING (id_projet) AS monprojet" mais je me suis dit que le problème serait le même : Si j'insère un nouveau projet, la variable monprojet contiendra alors la nouvelle valeur de clé primaire... Et donc comment faire référence à d'anciennes clés primaires....

    Bref, au secours !
    N'hésitez pas à me demander des précisions si je n'ai pas été claire !
    Merci par avance à ceux qui me liront et prendront le temps de m'aiguiller !

  2. #2
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Par quelle interface (outil d'admin ou langage de programmation) tu manipules les données?
    @+

  3. #3
    Membre averti
    Femme Profil pro
    Ingénieure novice !
    Inscrit en
    Juin 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Ingénieure novice !
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 21
    Par défaut
    Salut alassanediakite,

    A terme je manipulerai les données via php (car je créé une interface web dont les données saisies par l'utilisateur, via formulaires, seront récupérées et manipulées), mais pour l'instant j'essaie de comprendre comment tout cela fonctionne simplement en interagissant avec ma base de données via le terminal, je n'utilise pas d'outil d'administration.

  4. #4
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Les outils pour lignes de commandes ne sont vraiment pas fait pour ça!!! Ces genres de traitements se font avec des IHM graphiques.
    @+

  5. #5
    Membre averti
    Femme Profil pro
    Ingénieure novice !
    Inscrit en
    Juin 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Ingénieure novice !
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 21
    Par défaut
    Alors il n'est pas possible de s'en sortir avec le type SERIAL lorsqu'on interagit avec sa base de données via le terminal, sans aucun intermédiaire ? Il faut obligatoirement passer par une interface ?

    Entre temps j'ai essayé d'adapter mon interface web (elle existait déjà, mais avant les clés primaires étaient des varchar à saisir manuellement sur l'interface, oui c'est moche ), et j'arrive à m'en sortir en récupérant l'ensemble des projets (clé primaire + leur nom) et en les proposant dans un <select>. Ainsi l'utilisateur repère son projet grâce à son nom, et quand il le sélectionne je récupère la clé primaire qui va avec grâce à l'attribut value. Plus besoin de passer par currval() ou autre. Donc en effet je m'en sors mieux ainsi, mais j'aurais aimé savoir comment s'en dépatouiller sans interface...
    Dommage qu'apparemment ce ne soit pas possible ! Si quelqu'un d'autre a une astuce je suis toujours preneuse
    Quoiqu'il en soit merci pour ta rapide réponse alassanediakite !

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    En résumant fortement ta question je retiens ça:
    "s'il n'y a que currval() pour rappeler la dernière valeur d'une séquence mais que j'ai besoin de rappeler plusieurs valeurs, comment faire?"

    La solution est de stocker les valeurs dans des variables. Et au passage pour ce faire, RETURNING est la meilleure méthode, même si currval() marche aussi.

    Le problème n'est pas d'utiliser une interface graphique ou pas, c'est juste que quand on a besoin de lancer plusieurs requêtes et de traiter les résultats entre les deux, il faut faire un programme procédural, en php ou autre, qui ordonne tout ça et utilise des variables pour les résultats intermédiaires. Alors que "à la main" en mode terminal on n'a pas de variables.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb sur une requête DELETE sur une chaine
    Par astrolane dans le forum Sybase
    Réponses: 4
    Dernier message: 16/02/2009, 09h11
  2. Réponses: 9
    Dernier message: 07/02/2008, 16h42
  3. Réponses: 3
    Dernier message: 25/10/2007, 11h47
  4. initialiser une struc pointant sur une struct
    Par gronaze dans le forum C
    Réponses: 5
    Dernier message: 30/03/2006, 16h07

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