phpbar.de logo

Mailinglisten-Archive

AW: [php] Probleme mit MERGE

AW: [php] Probleme mit MERGE

Lutz Zetzsche php at sea-rescue.de
Mit Okt 1 11:18:53 CEST 2003


Hi Harald,

Zitat von ANGEL Harald <angel at egston.com>:

> Guten Morgen! *gähn*
>
> > warum hast Du denn 12 einzelne Tabellen, die identisch aufgebaut sind?
> weil das früher in access gelaufen ist.. und das hatte grobe speed probs...
> jetzt haben wir das abhängig von der userid aufgesplittet.
> in jeder tab sind jetzt ca 30000 sätze drin.
> nur wieder zusammenfügen (was ich auch wollte) wird schwierig, weil das
> autowert-feld meinungsid im feld parent drinsteckt..
> wenn ich die jetzt zusammenkopier passt meine baumstrucktur nicht mehr...

ah, ok. :-) Das verstehe ich. D.h. Du koenntest die Daten prinzipiell schon
zusammenkopieren, aber Du hast das Problem, dass Dein ID-Feld meinungsid in
Deinen MySQL-Tabellen auf autoincrement gesetzt ist?

Ich habe mir gerade ueberlegt, wie Du das loesen koenntest. :-) Ich hoffe, das
klappt auch. Du kannst es ja mal testweise ausprobieren, wenn Du Zeit und Lust
hast. :-)

Also angenommen, Du hast 12 Tabellen, die jetzt z.B. folgende Felder haben:

meinungsid (autoincrement, primary key)
parent
userid
meinung

Weitere Voraussetzungen:

(1) Ein Wert fuer meinungsid kann zwar in einer Tabelle nur einmal vorkommen
(primary key), wird aber auch in bis zu elf anderen Tabellen vorkommen. D.h. in
einer gemeinsamen Tabelle wuerde eine ID, die eigentlich Primaerschluessel sein
soll, bis zu 12 Mal vorkommen.
(2) Ein Wert im Feld parent bezieht sich nur auf eine meinungsid innerhalb einer
Tabelle und kann sich nicht auf eine meinungsid in einer anderen Tabelle
beziehen.

Unter diesen Voraussetzungen wuerde ich folgendes machen:

a) Ich wuerde eine gemeinsame Tabelle fuer die Datensaetze in den bisherigen 12
Tabellen mit folgenden Feldern anlegen:

meinungsid (autoincrement, primary key)
parent
userid
meinung
ALT_meinungsid
ALT_tabelle

b) Nun wuerde ich die die Daten aus den 12 Tabellen in die gemeinsame Tabelle
uebernehmen:

- meinungsid in der neuen Tabelle wird mit autoincrement automatisch neu
gesetzt.
- parent, userid und meinung werden 1:1 aus der alten in die neue Tabelle
umgefuellt.
- ALT_meinungsid in der neuen Tabelle wird mit der meinungsid aus der alten
Tabelle gefuellt.
- ALT_tabelle in der neuen Tabelle wird mit der Nummer der alten Tabelle belegt
(also z.B. mit einem Wert aus dem Zahlenbereich 1...12).

c) Nachdem Du die Daten umgefuellt hast, wird es interessant. :-) Jetzt
korrigierst Du die Eintraege im Feld parent. Dazu laeufst Du alle Datensaetze
in der neuen Tabelle durch und ziehst die meinungsid und die zugehoerigen Werte
ALT_meinungsid und ALT_tabelle:

select meinungsid as parentNeu, ALT_meinungsid as parentAlt, ALT_tabelle as
tabelleAlt from neue_tabelle;

Anschliessend laeufst Du alle Ergebniszeilen der Select-Abfrage durch und
ersetzt dabei in der gesamten neuen Tabelle die alten Werte in parent mit den
passenden neuen. Die Ersetzung sieht dann in der Schleife ungefaehr so aus:

update neue_tabelle set parent=parentNeu where parent=parentAlt and
ALT_tabelle=tabelleAlt;

Jetzt sollten die IDs im Feld parent passend zu den von MySQL automatisch
vergebenen IDs im Feld meinungsid der neuen Tabelle sein - wenn ich mich jetzt
nicht selbst ausgetrickst habe. :-) (Ich bin naemlich auch noch nicht so ganz
wach... ;-) )

d) Nach einem ausfuehrlichen Test, ob die Datenstruktur jetzt konsistent
uebernommen worden ist, kannst Du die Felder ALT_tabelle und ALT_meinungsid aus
der neuen Tabelle loeschen. Sie haben ihre Zweck erfuellt. :-)

Ich hoffe, ich habe in der Beschreibung keinen Denkfehler drin. Auf jeden Fall
sollte es so in der Art funktionieren. Ich habe Daten schon oefter mal so
zusammengefuehrt.

Viele Gruesse

Lutz


php::bar PHP Wiki   -   Listenarchive