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 :

Fusion avec clefs


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut Fusion avec clefs
    (Postgresql 8.2)
    Voila : j'ai deux tables A et B. A contient une clef primaire (id) et B une clef etrangere (id). Il y a au moins 1000 lignes dans B pour chaque id.

    Il y a 2 lignes dans A (=> 2000 lignes dans B)

    J'aimerais fusionner les lignes de B avec un seul id de A:
    Shématiquement, on aurait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    A                   B
    --                 -------
    1                   1
    2                   ..
                        1
                        2
                        ..
                        2
    ===========================
    Pour donner :
     
    A                   B
    --                 -------
    3                   3
    ==                 ..
                        3
    ==============================
    Je cherche une autre solution que de changer directement la table B. (Il n'y a pas qu'une seule table B et il peut y en avoir de nouvelles, ce qui m'obligerait à transformer ma requête SQL à chaque fois)
    Je pensais par exemple à forcer un update sur une ligne de A (id 1 => 2) ce qui changerait les id dans B, puis de supprimer la ligne de A (mais ça risque de supprimer aussi les lignes de B vu que cette bidouille ne devrait pas être prevue par postgres)

    Des idées?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Par défaut
    Je ne suis pas sûr d'avoir tout compris mais si je suis ce que tu dis je ferais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BEGIN;
    INSERT INTO A (id) VALUES (3);
    UPDATE B SET id=3;
    DELETE FROM A WHERE id<>3;
    COMMIT;

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    Oui et non

    Ce que tu proposes est ce que je ne voulais pas faire
    Je cherche une autre solution que de changer directement la table B.
    Tu fais un UPDATE B SET id=3;
    Sans chipoter sur les clauses WHERE de l'update :
    Tu agis directement dans B. Si il y a 10 tables "B", tu serais obligé d'avoir 10 fois ton UPDATE. Si je rajoute encore une table Bn, il faudra que je pense à changer la fonction et rajouter un update dedans. C'est ce que je veux éviter de faire.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Par défaut
    Alors explique mieux ton problème, sinon je serais dans l'impossibilité de t'aider

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    C'est faire en gros ce que tu as proposé, sans toucher explicitement à la table B ou alors de façon générique qui éviterait d'avoir à changer la fonction à chaque fois qu'on rajoute/enleve une table B.

    L'exemple qui me donne le résultat mais que je ne veux pas utiliser serait le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE B SET id = 2 WHERE id = 1;
    DELETE FROM A WHERE id = 1;
    => je fusionne les lignes de B associés à A par l'id 1 avec les lignes de B associés à A par l'id 2.

    Pour le shémas du premier post, ce serait plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE A SET id = 3 WHERE id = 2;
    UPDATE B SET id = 3 WHERE id = 1;
    DELETE FROM A WHERE id = 1;
    Si tu ne vois pas encore pourquoi je ne veux pas utiliser cette solution, imagine que je veuille rajouter une table B2 ayant les même caracteristique que B. Il faudrait que je change la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE A SET id = 3 WHERE id = 2;
    UPDATE B SET id = 3 WHERE id = 1;
    UPDATE B2 SET id = 3 WHERE id = 1;
    DELETE FROM A WHERE id = 1;
    Ce n'est pas grand chose à faire que de rajouter un update par-ci, un update par-là. Mais ça oblige l'adminitrateur à savoir quelles fonctions changer si il veut rajouter/supprimer une table. (Surtout quand il y a une dizaine de fontions)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Si sur B.id il y a la contrainte FOREIGN KEY avec ON UPDATE CASCADE et ON DELETE NO ACTION, tu peux updater la ligne dans A pour modifier d'un coup toutes les lignes de B, puis supprimer la ligne de A (puisqu'il y a un ON DELETE NO ACTION), la vérification de la contrainte de B sur A aura lieu a la fin de la transaction, donc peu importe quelles lignes sont supprimées dans A tant qu'a la fin pour tout id dans B il y en a un dans A

Discussions similaires

  1. Requête absente pour fusion avec Word
    Par stéphane_ais2 dans le forum Access
    Réponses: 5
    Dernier message: 05/12/2006, 15h08
  2. [FB 1.5.2] Pb requete avec clef etrangère
    Par gudul dans le forum SQL
    Réponses: 3
    Dernier message: 17/03/2006, 16h27
  3. Réponses: 4
    Dernier message: 08/03/2006, 13h22
  4. [fusion avec word] fusion pour publipostage (suite)
    Par Christophe93250 dans le forum Access
    Réponses: 17
    Dernier message: 13/01/2006, 11h47
  5. [fusion avec word] fusion pour publipostage via le mail auto
    Par Christophe93250 dans le forum Access
    Réponses: 6
    Dernier message: 06/01/2006, 16h27

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