Thomas: MySQL: Datensatz duplizieren

Hi,

ich möchte gerne in meiner Datenbank einen Datensatz duplizieren. Der neue soll also identisch mit dem alten sein, abgesehen von dem Primärschlüssel-Feld "id". Diesem Feld möchte ich einen neuen Wert zuweisen, der bisher noch nicht verwendet wurde, damit es da keine Konflikte geben kann.

Prinzipiell dachte ich, dazu die Syntax

INSERT INTO [tabellenname] SELECT * FROM [tabellenname] WHERE ( id = '34' );

zu benutzen, wobei ich da aber noch einbauen muß, daß das Feld "id"  einen neuen Wert bekommen soll. Bei obiger Syntax bekomme ich aber bereits immer schon die Fehlermeldung, obwohl die Tabelle [tabellenname] existiert:

Not unique table/alias: [tabellenname]

Ist der Ansatz im Prinzip richtig und wenn ja, wie baue ich ein, daß lediglich das Feld "id" im neuen Datensatz geändert werden soll?

Schon mal danke für die Antwort und Gruß

Thomas

  1. Hallo Thomas!

    INSERT INTO [tabellenname] SELECT * FROM [tabellenname] WHERE ( id = '34' );
    Ist der Ansatz im Prinzip richtig und wenn ja, wie baue ich ein, daß lediglich das Feld "id" im neuen Datensatz geändert werden soll?

    Mit welcher MySQL-Version arbeitest du?
    Aber ich glaube, bisher kann MySQL noch keine Subselects (ich bin mir nicht sicher, obs 4.1 können wird .. aber drunter glaube ich kann sies auf jeden Fall nicht, das kannst du aber bestimmt auf [http://www.mysql.com] nachlesen)

    Am einfachsten machst du wohl 2 SQL-Befehle.
    Also erstmal
    "SELECT feld1,feld2,usw FROM tabelle WHERE id = '34'"
    Dann wertest du das aus, und baust daraus nen Insert, den Du dann wieder an die DB schickst, also so ähnlich:
    "INSERT INTO tabelle (feld1,feld2,usw) VALUES('".$feld1."','".$feld2."','".$usw."')"

    Das sollte eigentlich problemlos funktionieren.

    MfG
    Götz

    --
    Losung und Lehrtext für Mittwoch, 1. Oktober 2003
    Der Herr sprach: Ich will hinfort nicht mehr die Erde verfluchen um der Menschen willen; denn das Dichten und Trachten des menschlichen Herzens ist böse von Jugend auf. (1.Mose 8,21)
    Es gibt keine Verdammnis für die, die in Christus Jesus sind. (Römer 8,1)
    (http://www.losungen.de/heute.php3)
    1. Hallo Götz,

      erstmal danke für deine Antwort.

      Mit welcher MySQL-Version arbeitest du?

      Ich benutze zur Zeit MySQL 4.0.12, das 4.1 ist ja erst im Alpha-Satdium.

      Aber ich glaube, bisher kann MySQL noch keine Subselects (ich bin mir nicht sicher, obs 4.1 können wird .. aber drunter glaube ich kann sies auf jeden Fall nicht, das kannst du aber bestimmt auf [http://www.mysql.com] nachlesen)

      Diese Schreibweise mit "INSERT ... SELECT" hatte ich mir aus meinem PHPMyAdmin abgeschaut, als ich dort auf der Suche war nach etwas, das wie "Datensatz multiplizieren" aussieht.

      Ich war vorher schon auf www.mysql.de gewesen und jetzt eben, während ich das schreibe, nochmal und siehe da, schon finde ich die Lösung:

      "Die Ziel-Tabelle des INSERT-Statements darf nicht in der FROM-Klausel des SELECT-Teils der Anfrage erscheinen..."

      zu finden auf:

      http://www.mysql.de/doc/de/INSERT_SELECT.html

      Ist mal wieder typisch, egal, wie lange und wo man sucht, es bleibt doch immer noch eine Glücksache. Deswegen finde ich ja auch die Foren so toll, weil man hier eine intelligente Antwort bekommt und nicht nur Suchmaschinen-Brei.

      Am einfachsten machst du wohl 2 SQL-Befehle.
      Also erstmal
      "SELECT feld1,feld2,usw FROM tabelle WHERE id = '34'"
      Dann wertest du das aus, und baust daraus nen Insert, den Du dann wieder an die DB schickst, also so ähnlich:
      "INSERT INTO tabelle (feld1,feld2,usw) VALUES('".$feld1."','".$feld2."','".$usw."')"

      Genau, das hatte ich mir auch als Alternative gedacht, nur weil ich insgesamt über 60 Felder (verteilt auf 4 Tabellen) habe, wollte ich es etwas einfacher machen. ;-)

      Also, nochmal vielen Dank für deine Antwort und schönes, verlängertes WE (ab Morgen Abend :-)

      Thomas