Markus: Datensatz duplizieren

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

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

    1. Naja, ums in einen Satz zu packen: Wolltest du vielleicht das folgende sagen?

      "Was du vor hast geht nicht"

      1. 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:

        • Erstelle eine exklusive Sperre auf Deine Tabelle
        • Erstelle eine temporäre Tabelle als Kopie.
        • Ermittle den höchsten Wert Deiner billing_id
        • Aktualisiere die temporäre Tabelle:
            Erhöhe die billing_id um den Maximalwert
            (ich gehe davon aus, dass die Spalte billing_id nur Werte größer 0 aufweist)
        • Füge mittels INSERT ... SELECT den Inhalt der temporären Tabelle in die
            Ausgangstabelle ein
        • Hebe die Sperre auf
        • Lösche die temporäre Tabelle

        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

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

          --
          "Love your nation - respect the others."
          1. 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

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