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 :

Question de fond reprise de données


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 131
    Points : 72
    Points
    72
    Par défaut Question de fond reprise de données
    Bonsoir

    Je dois envisager la reprise d'une base PostGres vers une autre base PostGres.

    J'ai à peu près les mêmes tables d'un côté comme de l'autre.

    Mais là n'est pas mon souci.

    J'essaye d'être clair :
    Dans ma base de réception (Base A), j'ai évidemment des clés primaires et étrangères.
    Dans ma base source (Base B), idem.

    Quelle serait aujourd'hui une technique éprouvée afin de renuméroter les Id de mes tables contenues dans ma Base B afin qu' ils n'entrent pas en conflit avec ceux contenus dans les tables de ma Base A ?

    Je n'attends évidemment pas une réponse parfaite à ma question mais au moins quelques pistes à approfondir.
    Je ne suis pas DBA, j'ai quelques notions de SQL.

    Je suis en train d'analyser ce que je dois reprendre table par table, d'analyser les structures des tables, etc....

    Merci de votre aide précieuse

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Y a t-il des données existantes communes aux deux BDD ?

    Quand on fait ce genre de choses, on commence par les tables qui n'ont pas de clé étrangère et on ajoute les lignes de B inexistantes dans les tables de A.

    Exemple avec une table de catégories (cat_id, cat_libelle)
    Dans ce type de table, en plus de l'identifiant qui est par défaut unique, il est fort logiquement probable que le cat_libelle le soit aussi.
    On peut donc faire cette requête pour importer les catégories de B qui ne sont pas dans A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO a.categorie (cat_libelle)
    SELECT cat_libelle 
    FROM b.categorie
    WHERE NOT EXIST (
      SELECT *
      FROM a.categorie
      WHERE a.categorie.cat_libelle = b.categorie.cat_libelle
    )
    ORDER BY b.cat_libelle
    Je suppose bien sûr ici que l'identifiant est incrémenté par une séquence.

    Ensuite si on a par exemple une table de produits qui a comme clé étrangère l'identifiant de la catégorie à laquelle il appartient, il faut faire la jointure sur le libellé pour affecter le nouvel identifiant de catégorie.

    Une requête de sélection pour vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.prd_id, p.prd_nom, 
      c1.cat_nom AS ancienne categorie,
      c2.cat_nom AS nouvelle_categorie,
      c2.cat_id
    FROM b.produit p
    INNER JOIN b.categorie c1 ON c1.cat_id = p.prd_id_categorie
      INNER JOIN a.categorie c2 ON c2.cat_nom = c1.cat_nom
    Et il suffit de la transformer un peu et de l'utiliser dans une requête d'insertion des nouveaux produits, sur le même principe que précédemment en cherchant l'ensemble de colonnes de la table source, hors identifiant, qui peuvent distinguer de manière unique une ligne de la table, autrement dit trouver une clé alternative à la clé primaire de la table.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre régulier
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 131
    Points : 72
    Points
    72
    Par défaut
    Bonjour et merci

    Citation Envoyé par CinePhil Voir le message
    Y a t-il des données existantes communes aux deux BDD ?
    Quand tu dis "existante", tu sous-entends les mêmes valeurs dans les champs style clés primaires ?

    Quand on fait ce genre de choses, on commence par les tables qui n'ont pas de clé étrangère et on ajoute les lignes de B inexistantes dans les tables de A.
    Ca je comprends ok je vais regarder si c'est le cas, mais pas sur ce serait trop simple.

    Exemple avec une table de catégories (cat_id, cat_libelle)
    Dans ce type de table, en plus de l'identifiant qui est par défaut unique, il est fort logiquement probable que le cat_libelle le soit aussi.
    On peut donc faire cette requête pour importer les catégories de B qui ne sont pas dans A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO a.categorie (cat_libelle)
    SELECT cat_libelle 
    FROM b.categorie
    WHERE NOT EXIST (
      SELECT *
      FROM a.categorie
      WHERE a.categorie.cat_libelle = b.categorie.cat_libelle
    )
    ORDER BY b.cat_libelle
    Je suppose bien sûr ici que l'identifiant est incrémenté par une séquence.
    Pour te répondre oui les id sont incrémentés par une séquence, je crois un truc du style nextval()

    Ensuite si on a par exemple une table de produits qui a comme clé étrangère l'identifiant de la catégorie à laquelle il appartient, il faut faire la jointure sur le libellé pour affecter le nouvel identifiant de catégorie.

    Une requête de sélection pour vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.prd_id, p.prd_nom, 
      c1.cat_nom AS ancienne categorie,
      c2.cat_nom AS nouvelle_categorie,
      c2.cat_id
    FROM b.produit p
    INNER JOIN b.categorie c1 ON c1.cat_id = p.prd_id_categorie
      INNER JOIN a.categorie c2 ON c2.cat_nom = c1.cat_nom
    Et il suffit de la transformer un peu et de l'utiliser dans une requête d'insertion des nouveaux produits, sur le même principe que précédemment en cherchant l'ensemble de colonnes de la table source, hors identifiant, qui peuvent distinguer de manière unique une ligne de la table, autrement dit trouver une clé alternative à la clé primaire de la table.
    Oula là ça se gate un peu....

    Je reviendrai poster un exemple concret pour essayer d'u voir plus clair.
    Et travailler avec une table de correspondance n'est-il pas un bon moyen ?

    Merci

Discussions similaires

  1. Question de fond : Composant ou pas Composant ?
    Par waterbed dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 3
    Dernier message: 23/06/2006, 18h46
  2. Réponses: 2
    Dernier message: 08/06/2006, 20h49
  3. Question de noob (transfer de donnée via url)
    Par manshoon dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2006, 10h24
  4. question sur le rafraichissement des données dans la base
    Par vbcasimir dans le forum Bases de données
    Réponses: 8
    Dernier message: 06/06/2005, 12h44
  5. DTS : Question simple sur sources de données
    Par guignol dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/05/2004, 12h09

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