Datensatz duplizieren
Markus
- datenbank
0 Vinzenz Mai0 Markus0 Vinzenz Mai0 Sven Rautenberg0 Vinzenz Mai0 Markus
Hallo auch. Ich möchte auf möglichst einfache Weise mehrere Datensätze duplizieren. Bisher bin ich bei fogender Abfrage gelandet:
INSERT INTO billing SELECT * FROM billing WHERE billing_id=26010111 ON DUPLICATE KEY UPDATE billing_id=LAST_INSERT_ID()
Leider passiert folgendes: Der Datensatz wird erkannt und will dupliziert werden. Leider geht das nicht, weil die billing_id des neuen Datensatzes gleich des des alten ist und diese leider in ein auto_increment Feld muss.
Daher dachte ich mir versuche ich es mit der ON DUPLICATE Funktion. Diese ändert allerdings nur den Wert des alten Datensatzes und letztlich hab ich doch kein Duplikat in der Datenbank.
Daher meine Frage: Wie stell ich so etwas an.
Ich möchte nicht alle Felder extra abtippen. Ich will alle außer das auto_increment Feld (billing_id) kopieren. Wie ist das also mit einer Abfrage zu bewerkstelligen?
Ich habe mySQL 5.1 und damit sind Subquerys möglich.
Mit freundlichen Grüßen,
Markus
Hallo
Hallo auch. Ich möchte auf möglichst einfache Weise mehrere Datensätze duplizieren. Bisher bin ich bei fogender Abfrage gelandet:
Ah ja. Selbst wenn das klappen sollte, was macht MySQL wenn es beim vorher letzten Datensatz angelangt ist? Der ist ja jetzt nicht mehr letzter Datensatz :-)
Daher meine Frage: Wie stell ich so etwas an.
Über eine temporäre Tabelle.
Ich will alle außer das auto_increment Feld (billing_id) kopieren. Wie ist das also mit einer Abfrage zu bewerkstelligen?
Liegt die Betonung auf _einer_ Abfrage? Das geht in MySQL 5.x ganz einfach:
SELECT dupliziere_datensaetze()
Einziger Haken bei der Geschichte: Die Funktion duplicate_rows musst Du selbst schreiben :-)
Freundliche Grüße
Vinzenz
Naja, ums in einen Satz zu packen: Wolltest du vielleicht das folgende sagen?
"Was du vor hast geht nicht"
Hallo Markus,
Naja, ums in einen Satz zu packen: Wolltest du vielleicht das folgende sagen?
"Was du vor hast geht nicht"
Nein. Selbstverständlich ist Dein Vorhaben durchführbar, ich schrieb doch nicht umsonst von einer temporären Tabelle. Eine (von mehreren) Möglichkeit wäre z.B:
Packe diese Schritte in eine Funktion, eine gute Idee wären Tabellenname und Name der Schlüsselspalte als Parameter, CREATE FUNCTION oder so ähnlich.
Rufe später die Funktion nach Belieben auf.
Freundliche Grüße
Vinzenz
Moin!
Nein. Selbstverständlich ist Dein Vorhaben durchführbar, ich schrieb doch nicht umsonst von einer temporären Tabelle.
Ich würde es mit einer dauerhaften Tabelle lösen:
Tabelle Kopien
id | anzahl
--------------
1 | 1
2 | 2
3 | 1
Durch inkrementieren des Kopien-Zählers kann man jeden Datensatz beliebig kopieren. Die eigentliche Datensatz-ID (wenn in diesem Zusammenhang Eindeutigkeit gewünscht ist) wäre die Kombination aus ID und Kopienzähler, beispielsweise in der Form "2.1", "2.2".
Andererseits könnte man auf die Idee kommen, dass ein Kopierbefehl sicher in SQL vorhanden wäre, wenn es Aufgabe der Datenbank sein soll, Datensätze wie blöde zu vervielfältigen. Vielleicht ist das dann doch eher Sache des Clients.
Disclaimer: In diesem Text ist Ironie versteckt.
- Sven Rautenberg
Hallo
Andererseits könnte man auf die Idee kommen, dass ein Kopierbefehl sicher in SQL vorhanden wäre, wenn es Aufgabe der Datenbank sein soll, Datensätze wie blöde zu vervielfältigen. Vielleicht ist das dann doch eher Sache des Clients.
*bg*
Vielleicht will Markus ja eine Dublettenerkunnung testen :-)
Ich liebe jedenfalls Funktionen, um mir Beispieldaten zu erzeugen. Neulich benötigte ich für ein Skript auf die Schnelle ein paar Hunderttausend Viewportbreiten.
SELECT erzeuge_beispieldaten(1000000)
reichte aus für eine Million Datensätze.
Freundliche Grüße
Vinzenz
Was ihr vorschlagt ist alles noch umständlicher als einmal kurz die 60 Felder abzuschreiben. D.h. ich werde das nun so machen, dann weiß ich, dass es geht und bin sicher noch schneller fertig zumal ich mir die Liste kurz mit phpmyadmin erstellen lassen kann.
Aber danke für die Anregungen.