bestimmte Datensätze in andere Tabelle "verschieben"
Matze
- datenbank
Hallo!
Ich möchte bestimmte Datensätze einer Tabelle bei Bedarf in eine andere Tabelle "verschieben".
Meine Idee war jetzt die betroffenen Datensätze aus Tabelle 1 mit mysql_fetch_assoc() in einem Array zu speichern, anschließend per Schleife und mit den Arraywerten als Kriterium die Datensätze löschen und zum Schluss per Schleife Teile der Werte des Arrays wieder in der Tabelle 2 speichern.
Das erscheint mir aber recht kompliziert.
Ist das der richtige Weg oder gibt es eine bessere Methode?
Im Titel steht nicht umsonst "verschieben".
Gibt es eine Funktion die Inhalte einzelner Spalten bestimmter Datensätze in eine andere Tabelle zu verschieben und den kompletten originalen Datensatz dabei gleichzeitig zu löschen?
Danke für eure Hilfe!
Grüße, Matze
Hi,
Ich möchte bestimmte Datensätze einer Tabelle bei Bedarf in eine andere Tabelle "verschieben".
Meine Idee war jetzt die betroffenen Datensätze aus Tabelle 1 mit mysql_fetch_assoc() in einem Array zu speichern, anschließend per Schleife und mit den Arraywerten als Kriterium die Datensätze löschen und zum Schluss per Schleife Teile der Werte des Arrays wieder in der Tabelle 2 speichern.
Das erscheint mir aber recht kompliziert.
Ist das der richtige Weg oder gibt es eine bessere Methode?
Nein, der "Umweg" ueber PHP ist sicherlich keine gute Idee.
Mach's direkt auf der Datenbank - INSERT ... SELECT ist was du suchst ...
Im Titel steht nicht umsonst "verschieben".
... und dann feuerst du noch ein DELETE auf die urspruengliche Tabelle hinterher, mit gleicher WHERE-Klausel.
Gibt es eine Funktion die Inhalte einzelner Spalten bestimmter Datensätze in eine andere Tabelle zu verschieben und den kompletten originalen Datensatz dabei gleichzeitig zu löschen?
Nein, "gleichzeitig" ist mir nichts bekannt, du wirst wohl obigen Weg gehen muessen.
Natuerlich sollte das ganze in eine Transaktion gekapselt werden, damit man nicht erst mal X Datensaetze in die andere Tabelle einfuegt, und dann anschliessend mehr als X Datensaetze loescht, wenn zwischenzeitlich welche hinzu gekommen sind ...
MfG ChrisB
Hallo ChrisB!
Nein, der "Umweg" ueber PHP ist sicherlich keine gute Idee.
Mach's direkt auf der Datenbank - INSERT ... SELECT ist was du suchst ...
Also doch mit einem Sub-Select. Hm, mal sehn ob ich das hin kriege.
Natuerlich sollte das ganze in eine Transaktion gekapselt werden, damit man nicht erst mal X Datensaetze in die andere Tabelle einfuegt, und dann anschliessend mehr als X Datensaetze loescht, wenn zwischenzeitlich welche hinzu gekommen sind ...
Ja genau, daran dachte ich. Deswegen hätte ich in meiner Variante auch nur die bereits abgefragten Datensätze gelöscht.
Danke und Grüße,
Matze
Hi,
Natuerlich sollte das ganze in eine Transaktion gekapselt werden, damit man nicht erst mal X Datensaetze in die andere Tabelle einfuegt, und dann anschliessend mehr als X Datensaetze loescht, wenn zwischenzeitlich welche hinzu gekommen sind ...
Ja genau, daran dachte ich. Deswegen hätte ich in meiner Variante auch nur die bereits abgefragten Datensätze gelöscht.
Alle Datensaetze erst zu PHP "rueberzuschaufeln", und dann einzeln wieder irgendwo einzufuegen, ist und bleibt aber aeusserst unperformant.
Wenn dir keine Moeglichkeit gegeben ist, Transaktionen zu nutzen - dann wuerde ich zur Not zunaechst nur die IDs der Datensaetze selektieren, die in Frage kommen, diese dann in PHP zu einer "WHERE id IN(...)"-Klausel zusammenbauen, und diese dann beim INSERT und DELETE verwenden. Auch nicht der Performance-Weisheit letzter Schluss - aber immerhin schon mal besser, als die kompletten Datensaetze hin zu PHP und wieder zurueck zu schaufeln ...
MfG ChrisB
Hallo und guten Abend!
Sorry, hatte ich gar nicht gelesen.
Siehe: hier.
Also leg ich noch eine Spalte für id in Tabelle 1 an womit ich dann ein Kriterium zum löschen hätte.
Eine auto_increament Spalte bietet sich dafür an oder?
Danke und Grüße,
Matze
echo $begrüßung;
Mach's direkt auf der Datenbank - INSERT ... SELECT ist was du suchst ...
Also doch mit einem Sub-Select. Hm, mal sehn ob ich das hin kriege.
Nein, das ist kein Subquery im herkömmlichen Sinne. [*]
Natuerlich sollte das ganze in eine Transaktion gekapselt werden, [...]
Ja genau, daran dachte ich. [...]
Damit wirst du ein Problem haben, wenn dir die InnoDB-Storage-Engine nicht zur Verfügung steht oder aus anderen Gründen nicht eingesetzt werden kann (Fulltext-Index beispielsweise). Alternativen sind Table-Locking und Multiple-Table-DELETE. Lösche nach erfolgtem Kopieren die Datensätze aus dem Original, die in der Kopie vorhanden sind. Beachte, dass die Schlüssel über beide Tabellen eindeutig gehalten werden müssen. Dafür hat MySQL keinen Mechanismus[**]. Markieren als gelöscht bzw. als nicht mehr zu verwenden wäre eine weitere Variante ohne die Probleme der Mehrort-Speicherung beachten zu müssen.
[*] Das erkennt man unter anderem daran, dass keine Klammern drumrum müssen, die zwingender Bestandteil eines Subquerys sind. Selbst wenn das Ergebnis in einem Funktionsaufruf platziert werden soll, sind extra Subquery-Klammern notwendig: SELECT FUNCTION( (SELECT ...) )
[**] Vielleicht doch: mit einem Trigger eine Prüfung anstoßen. Aber das ist auch mit Vorsicht und Umsicht zu genießen. (Also, nicht der Trigger an sich, nur ihn für dieses Problem zu verwenden.)
echo "$verabschiedung $name";
Hallo nochmal!
Mach's direkt auf der Datenbank - INSERT ... SELECT ist was du suchst ...
Also ich habe in meiner Zieltabelle eine Spalte, die für diese Insert-Anweisung einen Standardwert setzen soll der aber in der Originaltabelle nicht vorkommt.
INSERT INTO tbl2 (col1, col2) SELECT orig_col2 FROM tbl1 WHERE...
col2 in tbl2 soll also den Wert von orig_col2 aus tbl1 annehmen.
col1 soll allerdings einen Default-Wert annehmen der von der Standard-Einstellung der Spalte abweicht.
Sagen wir einfach "1" und Standard ist "0".
Müsste ich es so umschreiben?
INSERT INTO tbl2 (col1, col2) VALUES('1', SELECT orig_col2....)
Danke und Grüße,
Matze
Hi,
col2 in tbl2 soll also den Wert von orig_col2 aus tbl1 annehmen.
col1 soll allerdings einen Default-Wert annehmen der von der Standard-Einstellung der Spalte abweicht.Müsste ich es so umschreiben?
INSERT INTO tbl2 (col1, col2) VALUES('1', SELECT orig_col2....)
Wenn's so "funzt", meinetwegen - andernfalls kannst du natuerlich in einem SELECT neben Spalteninhalten auch einfach statische Werte "abfragen", bspw.
SELECT spalte1, spalte2, 4711, "blahfasel" FROM tabelle
^^^^ ^^^^^^^^^^^
MfG ChrisB
Hallo ChrisB!
Wenn's so "funzt", meinetwegen
Ich glaub es nicht, hab es aber auch nicht versucht. Ich spiel da grad nur nebenbei rum.
andernfalls kannst du natuerlich in einem SELECT neben Spalteninhalten auch einfach statische Werte "abfragen", bspw.
SELECT spalte1, spalte2, 4711, "blahfasel" FROM tabelle
^^^^ ^^^^^^^^^^^
Wie meinen? Also einfach einen statischen Wert angeben, der als Spalte gar nicht existiert?
Also:
INSERT INTO tbl2 (col1, col2) SELECT '1', orig_col2 FROM tbl1 WHERE...
Gibt MySQL da keinen Fehler zurück wenn es keine Spalte '1' in tbl1 gibt?
Danke und Grüße,
Matze
Hi,
Wie meinen? Also einfach einen statischen Wert angeben, der als Spalte gar nicht existiert?
Ja, schreibtete ich doch gerade, oder? :-)
INSERT INTO tbl2 (col1, col2) SELECT '1', orig_col2 FROM tbl1 WHERE...
Gibt MySQL da keinen Fehler zurück wenn es keine Spalte '1' in tbl1 gibt?
Noe, MySQL kennt doch seine Syntax, und weiss, dass das gar kein Spaltenbezeichner sein kann, wenn er als Literal angegeben wird.
MfG ChrisB
Hi,
Wie meinen? Also einfach einen statischen Wert angeben, der als Spalte gar nicht existiert?
Ja, schreibtete ich doch gerade, oder? :-)
Jap, schrubst du ;)
Noe, MySQL kennt doch seine Syntax, und weiss, dass das gar kein Spaltenbezeichner sein kann, wenn er als Literal angegeben wird.
Klar logisch, umgedreht gehts ja auch nicht, also wenn ich einen Spaltennamen in '' setze.
Klappt jedenfalls wunderbar. Manchmal brauch ich halt ne Weile^^
So, jetzt hab ich die Datensätze also in meiner zweiten Tabelle.
Wie müsste ich vorgehen, damit ich anschließend wirklich nur die betroffenen Datensätze lösche und nicht, was wir beide schon bedacht hatten, zwischen INSERT...SELECT und DELETE neu hinzugekommene die dann beim DELETE auch der WHERE-Klausel entsprechen könnten?
Eine id ist in beiden Tabellen nicht angelegt und die Datensätze in Tabelle 2 können doppelt vorhanden sein.
Sollte ich noch einen eindeutigen Wert in die zweite Tabelle übernehmen, evtl. eine id für Tabelle 1 anlegen und die dafür benutzen?
Oder sind die Daten noch irgendwo "zwischengespeichert", so dass ich ohne Probleme eine DELETE-Anweisung hinterher schieben kann?
Danke und Grüße,
Matze
Hallo
Sollte ich noch einen eindeutigen Wert in die zweite Tabelle übernehmen, evtl. eine id für Tabelle 1 anlegen und die dafür benutzen?
wenn Du die Datensätze nicht identifizieren kannst, dann kannst Du sie auch nicht fürs Löschen identifizieren.
Oder sind die Daten noch irgendwo "zwischengespeichert", so dass ich ohne Probleme eine DELETE-Anweisung hinterher schieben kann?
Nein, DBMS können nicht hellsehen. Sie cachen zwar manches, aber nur für den Fall, dass die gleiche Abfrage kurze Zeit später erneut ausgeführt wird.
Freundliche Grüße
Vinzenz
Hallo und guten Abend!
Danke an alle, ich hab es hingekriegt.
Ich hab eine zusätzliche Spalte für eine id angelegt.
Der letzte Fehler der mich aufhielt, war ein Tippfehler den ich schlecht gefunden habe.
Ich hab leider immernoch nicht raus bekommen wie ich die Systemschriftart unter SUSE größer stelle, aber das ist ein anderes Thema.
Nachmals dank und Gruß,
Matze