Ergebnis 1 bis 7 von 7

Thema: Migration auf Abfrage basierend

  1. #1
    tippex ist offline Neuer Benutzer
    Registriert seit
    14.12.2005
    Beiträge
    21

    Frage Migration auf Abfrage basierend

    Hallo zusammen,

    leider konnte ich in der Postgres-Doku keinen geeignete Informationen zu folgendem Problem finden.

    Es liegt eine Datenbank mit z.T. inkonsistenten Kundendaten vor. Anhand gültiger Verträge würde ich gern die Kunden selektieren, die "richtig" sind und in einen neue Datenbank importieren.

    Nun habe ich gehofft, dass Postgres eine Funktion hat, die es ermöglicht alle abhängigen Datensätze eines Datensatzes zu ermitteln und genau diese Ergebnismenge zu dumpen.

    Hat eventuell jemand von Euch eine Idee wie ich vorgehen könnte?

    Viele Grüße.

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.471

    Standard

    Zitat Zitat von tippex Beitrag anzeigen
    Hallo zusammen,

    leider konnte ich in der Postgres-Doku keinen geeignete Informationen zu folgendem Problem finden.

    Es liegt eine Datenbank mit z.T. inkonsistenten Kundendaten vor. Anhand gültiger Verträge würde ich gern die Kunden selektieren, die "richtig" sind und in einen neue Datenbank importieren.

    Nun habe ich gehofft, dass Postgres eine Funktion hat, die es ermöglicht alle abhängigen Datensätze eines Datensatzes zu ermitteln und genau diese Ergebnismenge zu dumpen.

    Hat eventuell jemand von Euch eine Idee wie ich vorgehen könnte?

    Viele Grüße.
    Deine Problembeschreibung ist vage, vielleicht habe ich es auch komplett falsch geparst. Mal sehen.

    Du hast z.B. 2 Tabellen, hier master und slave genannt:

    test=# select * from master;
    id | name
    ----+---------
    1 | master1
    2 | master2
    (2 rows)

    test=*# select * from client;
    id | name
    ----+-----------
    1 | client1_1
    1 | client1_2
    2 | client2_1
    3 | client3_1
    (4 rows)

    Der Datensatz mit id=3 in slave ist offensichtlich falsch, er hat keinen Bezug (mehr) in Master.
    Du willst nun alle gültigen/ungültigen Datensätze aus slave:

    test=*# select * from client where id in (select id from master);
    id | name
    ----+-----------
    1 | client1_1
    1 | client1_2
    2 | client2_1
    (3 rows)

    test=*# select * from client where id not in (select id from master);
    id | name
    ----+-----------
    3 | client3_1
    (1 row)


    Nach diesem Verfahren könntest Du nun z.B. eine neue Tabelle für slave erzeugen, die gültige Daten enthält:

    test=*# create table new_slave as select * from client where id in (select id from master);
    SELECT


    Und dann dafür sorgen, daß Deine RI in Zukunft erhalten bleibt:

    test=# alter table master add primary key (id);
    NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "master_pkey" for table "master"
    ALTER TABLE
    test=*# alter table new_slave add constraint fk foreign key (id) references master(id);
    ALTER TABLE


    Falls Dir das nichtweiterhilft, würde uns es helfen, wenn Du mehr Details (Aufbau der Tabellen etc.) liefern könntest.
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    tippex ist offline Neuer Benutzer
    Registriert seit
    14.12.2005
    Beiträge
    21

    Standard

    Ok ich versuche es etwas genauer zu erklären:

    Tabelle client

    id | client_nr | name
    --------------------
    1 | N5 | client_1
    2 | N5 | client_1
    4 | N6 | client_2
    5 | N7 | client_3

    Tabelle contract

    id | client_id | contract_number
    --------------------
    1 | 1 | AN1001
    2 | 2 | AN1002

    Hier ist das Problem : Die Einträge in client sind nicht eindeutig nach client_nr, so dass Contracts einmal an die client_id=1 und an die client_id=2 gehängt wurden, obwohl sämtliche Contracts zur client_nr=N5 an client_id=1 hängen müßten. Das hängt mit dem Frontend zusammen, der Anwender sieht nur die client_nr.

    Meine Idee war nun alle Contracts zu selektieren und nur die Clients zu übernehmen, die mit einem Contract verbunden sind. Um die Datenmenge "sinnloser" Sätze in Client schonmal etwas zu reduzieren.

    Ich dachte es gäbe dann eine Funktion, die sämtliche Datensätze aus allen zu clients abhängigen Tabellen (Verknüpft mit Foreign Keys) mit selektiert.

    Es handelt sich auch nicht nur um zwei Tabellen, sondern um wesentlich mehr.

  4. #4
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Nun, du könntest einen ganz normalen Join darüber laufen lassen, der die Datensätze verknüpft. Die nicht vorhandenen auf einer Seite werden dabei ausgelassen.

    Wenn ich dein Problem jetzt richtig verstanden habe ...
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  5. #5
    tippex ist offline Neuer Benutzer
    Registriert seit
    14.12.2005
    Beiträge
    21

    Standard

    Genau. Und wie bekomme ich die Daten in die neue Datenbank?

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.471

    Standard

    Zitat Zitat von tippex Beitrag anzeigen
    Genau. Und wie bekomme ich die Daten in die neue Datenbank?
    Das Resultat Deiner Bereinigung z.B. in einer neuen Tabelle speichern und dann die Tabellen halt umbenennen.

    Also

    create table new_table as select ...
    dann die alte tabelle zu old_table umbenennen und dann new_table in table umbenennen.
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    tippex ist offline Neuer Benutzer
    Registriert seit
    14.12.2005
    Beiträge
    21

    Standard

    Sorry, wenn ich jetzt etwas umständlich bin:

    Also das Ergebnis des Joins enthält doch Datensätze aus mehreren Tabellen, die auch wieder in diesselben Tabellen aufgesplittet werden sollen.

    Ich könnte das Join-Ergebnis mit "create table new_table as select" in eine Tabelle speichern. Und aus dieser Tabelle die Daten dann wieder splitten.

    Das könnte funktionieren.

Ähnliche Themen

  1. bytea Migration von 8.4 nach 9.0
    Von rolf.schaufelberger im Forum Migration
    Antworten: 1
    Letzter Beitrag: 11.01.2011, 18:26
  2. Migration von 8.1 auf 8.3.1
    Von Matrix-NTN im Forum Allgemeines
    Antworten: 3
    Letzter Beitrag: 13.04.2008, 21:58
  3. Migration von SQLExpress
    Von hmb99 im Forum Migration
    Antworten: 2
    Letzter Beitrag: 17.12.2007, 14:19
  4. Migration von Informix - PostgreSQL
    Von kiaaap im Forum Migration
    Antworten: 7
    Letzter Beitrag: 10.05.2007, 10:26
  5. Migration Postgres 7.xx auf 8.xx
    Von bonobo im Forum Migration
    Antworten: 3
    Letzter Beitrag: 27.02.2007, 17:45

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum