Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Daten in andere DB kopieren und vorhandene ignorieren

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von jojo6, 10 April 2014.

  1. jojo6

    jojo6 Benutzer

    Hallo zusammen,
    ich bin relativ neu was Datenbanken und SQL angeht. Nun soll ich aber folgendes umsetzen:

    Es gibt 2 Datenbanken (beide MySQL).
    In DB_1 habe ich die Tabelle tbl_main, die Datensätze zu Teilen enthält. (Nr und Bezeichnung, Version)

    In DB_2 habe ich eine Tabelle tbl_teile, die ebenfalls Datensätze zu Teilen enthält, dazu die Versionsangabe, den Freigabestatus und den Dateityp.

    Aufgrund eines unterschiedlichen Nummernsystems gibt es daher leider zwei Tabellen, diese sollen aber zusammengeführt werden (in der tbl_main).

    Nun sollen (stündlich) ein Prozess durchgeführt werden, bei dem überprüft wird, ob es neue Datensätze in der tbl_teile gibt, die in die tbl_main kopiert/aktualisiert werden müssen.
    Also auch wenn sich der Freigabestatus bzw. Version ändert muss dies angepasst werden.
    Bei einem komplett neuen Datensatz (der bisher noch nicht in der tbl_main vorhanden ist) soll dieser natürlich rüber kopiert werden.

    tbl_main
    *teileNr (primary)
    -name
    -version

    tbl_teile
    *id (autincrement)
    -teileNr
    -name
    -version
    -status
    -dokumenttyp

    Wobei der Dokumenttyp erst mal noch außer Acht gelassen werden kann.

    Wie muss ich dazu beginnen? Benutze ich dazu eine Stored Procedure? Wie kann ich dies stündlich (automatisiert) anstossen?
    Genügt eine Procedure oder brauche ich für den Updatevorgang (falls notwenig) eine weitere?

    Und brauch ich dazu eine Zwischentabelle o.ä.?

    Vielleicht kann mir jemand dazu einen Ansatz zeigen, zumindest dass ich die Daten mal rüber bekomme, den Filter sollte ich (hoffentlich) alleine schaffen.

    Würde mich sehr freuen, wenn ihr mit helft! Danke!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Es wäre besser, diesen Quark einmalig aufzuräumen.

    Kann man machen, muß man nicht.

    Cron.

    SQL, das unbekannte Wesen, gell?


    Du hast:

    Code:
    test=# select * from tbl_main ;
     nr |  name  | version
    ----+--------+---------
      1 | teil 1 |  2
      2 | teil 2 |  12
    (2 rows)
    
    test=*# select * from tbl_teile;
     id | nr |  name  | version
    ----+----+--------+---------
      1 |  1 | teil 1 |  3
      2 |  3 | teil 3 |  33
    (2 rows)
    
    Nun:

    Code:
    test=*# update tbl_main set version=tbl_teile.version from tbl_teile where tbl_main.nr=tbl_teile.nr;
    UPDATE 1
    test=*# insert into tbl_main select nr, name, version from tbl_teile where nr not in (select nr from tbl_main);
    INSERT 0 1
    test=*# select * from tbl_main ;
     nr |  name  | version
    ----+--------+---------
      2 | teil 2 |  12
      1 | teil 1 |  3
      3 | teil 3 |  33
    (3 rows)
    
    Siehst Du eine bei mir?

    Da hst Du meinen Ansatz. PostgreSQL, sollte in MySQL mit viel Glück auch so gehen. MySQL ist halt behindert, da kann man sich nicht immer sicher sein, ...
     
  3. ukulele

    ukulele Datenbank-Guru

    Man muss sich aber auch darüber im klaren sein was mit doppelten Einträgen passiert wenn in tbl_main schon ein Teil mit der Nr. 1 steht und aus tbl_teile ein weiteres mit Nr.1 und anderen Werten kommen soll.
     
  4. BerndB

    BerndB Datenbank-Guru

    Hi,

    du kannst das ganze auf einfach mit triggern realisieren d.h. das beim einfügen, ändern oder löschen einer Zeile in Tabelle 1 oder 2 direkt geprüft werden kann ob ein update, insert in tabelle 3 notwendig ist. Dadurch sind deine Daten in Tabelle 3 immer aktuell.

    Falls du aber nur jede Stunde oder so was machen willst bietet MySQL schon Events an, die man zeitgesteuert in starten kann und somit auf den cron-Job verzichten kann.

    Möglichkeit Nr.3 ist eine View anlegen die einen Merge aus beiden Tabellen anzeigt, geht dann aber nur zum lesen, da es Tabelle 3 dann nicht wirklich gibt.

    Gruss

    Bernd
     
  5. jojo6

    jojo6 Benutzer

    Wie kann ich das denn direkt prüfen was notwendig ist? Bzw. wie wird dann die jeweilige Aktion ausgeführt?
     
  6. ukulele

    ukulele Datenbank-Guru

    Der oder die Trigger lösen aus wenn eine der Aktionen (Insert, Update, Delete) auf der Tabelle ausgeführt werden. Was dann passiert muss aber schon explizit geschrieben werden und mit IF-Funktionen etc. bestimmen, ob und welche weiteren Aktionen ausgeführt werden.

    Das ist schon etwas arbeit aber es vermeidet unnötige Aktionen in der DB wie z.B. das komplette Kopieren von Daten wenn sich nur ein Teil geändert hat.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden