Zwei Tabellen verbinden

marco.hil

Neuer Benutzer
Beiträge
3
Hallo Leute,

ich habe folgendes Problem:

Derzeit betreibe ich zwei Datenbanken die IDENTISCH sind... Eine ist im Echtbetrieb, die andere wird als Sicherung verwendet...

- (Echtbetrieb-)Datenbank enthält aktuelle Daten [Löschen der Einträge und alles durch Benutzer möglich]
- (Sicherungs-)Datenbank enthält alle Daten, die irgendwann mal vorhanden waren und gesichert wurden [also auch im Echtbetrieb später gelöscht Einträge]

Ich möchte nun die Daten der Echtbetrieb-Tabelle in die Sicherungs-Tabelle kopieren, jedoch nur die neu hinzugekommenen Einträge, damit keine Doppeleinträge entstehen.
Da die manuelle Kopiererei etwas anstrengend ist und ich das ganze gerne per PHP Script realisieren würde, brauche ich nun etwas Hilfe.

Ist es denn überhaupt möglich Tabellen per SQL zu vergleichen? Also unabhängig vom Spaltennamen etc.?

Ich habe mir UNION und UNION ALL angeschaut, aber das ist irgendwie nicht das was ich brauche.


Vielen Dank schon mal

Gruß
Marco
 
Werbung:
Hallo Leute,

ich habe folgendes Problem:

Derzeit betreibe ich zwei Datenbanken die IDENTISCH sind... Eine ist im Echtbetrieb, die andere wird als Sicherung verwendet...

- (Echtbetrieb-)Datenbank enthält aktuelle Daten [Löschen der Einträge und alles durch Benutzer möglich]
- (Sicherungs-)Datenbank enthält alle Daten, die irgendwann mal vorhanden waren und gesichert wurden [also auch im Echtbetrieb später gelöscht Einträge]

Ich möchte nun die Daten der Echtbetrieb-Tabelle in die Sicherungs-Tabelle kopieren, jedoch nur die neu hinzugekommenen Einträge, damit keine Doppeleinträge entstehen.
Da die manuelle Kopiererei etwas anstrengend ist und ich das ganze gerne per PHP Script realisieren würde, brauche ich nun etwas Hilfe.
Manuell? Da machst was falsch. Und PHP ist nicht die Lösung. Die Lösung wäre, dies die DB machen zu lassen. TRIGGER wären hier eine Lösung.

Ist es denn überhaupt möglich Tabellen per SQL zu vergleichen? Also unabhängig vom Spaltennamen etc.?

Sicher. Datenbanken arbeiten mit Mengen und haben dazu auch passende Operatoren. So liefert Dir z.B. INTERSECT die Schnittmenge und EXCEPT die 'Fehlmenge' zweier Mengen.

Doku-Service:

Code:
INTERSECT returns all rows that are both in the result of query1 and in the result of query2. Duplicate rows are eliminated unless INTERSECT ALL is used.

EXCEPT returns all rows that are in the result of query1 but not in the result of query2. (This is sometimes called the difference between two queries.) Again, duplicates are eliminated unless EXCEPT ALL is used.

Davon abgesehen:
  • Datenbanken und Tabellen sind NICHT dasselbe. Das scheint Dir nicht bekannt zu sein.
  • sinnvoll bei solch einer Archivierung wäre es vielleicht, dazu auch Metadaten zu speichern(wer wann warum)

Es gibt fertige Lösungen für sowas.
 
Hallo,

danke für die schnelle Antwort...

Vorweg:
Ich verstehe ein wenig was von Datenbanken und weiß was Tabellen und was Datenbanken sind... Wie auch immer aus meinem Post hervorgehen soll, dass ich das nicht tue?! Vllt. die Formulierung, dass ich die TABELLEN-Daten kopieren möchte?
Natürlich meine ich die jeweilige IDENTISCHE Tabelle aus den beiden Datenbanken.

Werde mir später deine Lösungsvorschläge anschauen... Kannte ich bis jetzt nicht...
Die "Archivierung" soll ja nicht nur eine Sicherung sein, sondern auch Recherchierbar bleiben... Da ich das ganze wie PHP auslese und mir anzeigen lasse, wollte ich auch eine PHP basierte Lösung zum "Kopieren" machen...

Der Operator EXCEPT braucht doch eine genaue Vergleichtvariable? Wie kann ich nun z.B. den Primary Key hernehmen zum vergleich, ohne dass ich den Namen dazu weiß?


Gruß
Marco
 
Ich verstehe ein wenig was von Datenbanken und weiß was Tabellen und was Datenbanken sind... Wie auch immer aus meinem Post hervorgehen soll, dass ich das nicht tue?! Vllt. die Formulierung, dass ich die TABELLEN-Daten kopieren möchte?
Natürlich meine ich die jeweilige IDENTISCHE Tabelle aus den beiden Datenbanken.

Dann ist ja gut.

Werde mir später deine Lösungsvorschläge anschauen... Kannte ich bis jetzt nicht...
Die "Archivierung" soll ja nicht nur eine Sicherung sein, sondern auch Recherchierbar bleiben... Da ich das ganze wie PHP auslese und mir anzeigen lasse, wollte ich auch eine PHP basierte Lösung zum "Kopieren" machen...

Und genau das ist das Problem. Weil eines Tages kommt jemand, der eben NICHT Dein Stück Software nimmt, um da was zu löschen, sondern direkt mit SQL gegen die Datenbank wirft. Dann steht Deine PHP-Frickellösung hilflos in der Ecke.

Der Operator EXCEPT braucht doch eine genaue Vergleichtvariable? Wie kann ich nun z.B. den Primary Key hernehmen zum vergleich, ohne dass ich den Namen dazu weiß?

Ich denke, Du kennst Deine Tabellen?

Lösungen für das, was Du machen willst:


Basieren aber beide auf einer richtigen Datenbank und nicht auf MySQL.
 
Also mit EXCEPT kann man schon sehr viel sehr bequem lösen:
Code:
SELECT    pk,spalte1,...
FROM    quell_tabelle
EXCEPT
SELECT    pk,spalte1,...
FROM    ziel_tabelle
Diesen Select kann man dann mit einem INSERT INTO davor in die Tabelle schreiben, ich denke das muss ich nicht zeigen. Wenn du jetzt sagst ich will nur neue Datensätze aber die Felder haben sich eventuell verändert (was mir egal ist) machst du halt soetwas:
Code:
SELECT    pk,spalte1,...
FROM    quell_tabelle
WHERE    pk IN (        SELECT    pk
                    FROM    quell_tabelle
                    EXCEPT
                    SELECT    pk
                    FROM    ziel_tabelle )
In MSSQL gibt es dann noch MERGE wenn man viele Daten vergleichen will und möglichst wenig Operationen dazu nutzen will, auch sehr praktisch. Für MySQL habe ich das jetzt nicht nachgeguckt.
 
Werbung:
Zurück
Oben