Daten in andere DB kopieren und vorhandene ignorieren

jojo6

Benutzer
Beiträge
6
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!
 
Werbung:
Aufgrund eines unterschiedlichen Nummernsystems gibt es daher leider zwei Tabellen, diese sollen aber zusammengeführt werden (in der tbl_main).

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

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.


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

Wie muss ich dazu beginnen? Benutze ich dazu eine Stored Procedure?

Kann man machen, muß man nicht.

Wie kann ich dies stündlich (automatisiert) anstossen?

Cron.

Genügt eine Procedure oder brauche ich für den Updatevorgang (falls notwenig) eine weitere?

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)

Und brauch ich dazu eine Zwischentabelle o.ä.?

Siehst Du eine bei mir?

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!

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, ...
 
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.
 
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
 
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.

Wie kann ich das denn direkt prüfen was notwendig ist? Bzw. wie wird dann die jeweilige Aktion ausgeführt?
 
Werbung:
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.
 
Zurück
Oben