Mit begrenztem Wissen über Computer, Software und 42

schreibt Andre

MySQL Tabellen kopieren mit PHP CREATE TABLE neuTab LIKE altTab

07.03.11 (MySQL, PHP)

Vor kurzen habe ich mal wieder Stunden an Arbeitszeit vergeudet, beim Versuch die Struktur einer MySQL-Tabelle zu kopieren. Eigentlich geht dies ganz einfach mit dem SQL-String:

CREATE TABLE neuTab LIKE altTab

Wenn man jetzt noch absichert, dass die Tabelle nur erstellt wird, wenn sie noch nicht vorhanden ist:

CREATE TABLE IF NOT EXISTS neuTab LIKE altTab

dann ist die Sache schnell erledigt.

So sollte man denken. Allerdings wird dies erst ab Version 4.1 von MySQL unterstützt. Der Provider bei dem das Script laufen sollte, verwendet allerdings noch die MySQL-Version 4.0.18 (uralt Vertrag bei 1und1). Deswegen folgten also Stunden von verzweifelten Versuchen, verbunden mit dem Verlust des Glaubens an die eigenen Fähigkeiten, so dass ich den Fehler immer wieder in meinem kleinen Script suchte und nicht auf grundsätzliche Ursachenforschung ging.

Also bei MySQL-Versionen vor 4.1  nehme man folgendes Verfahren:

  • Auslesen der Create-Syntax der altTab
  • Ersetzen des alten Tabellennamens mit dem neuen Tabellennamen im CreateSQL-String
  • Dann erstellen der neuen Tabelle mit dem eben veränderten CreateSQL-String

In PHP könnte dies dann ungefähr so aussehen (hier mit einer etwas merkwürdigen Datenbank-Klasse):

function copy_table($orgtab, $neutab)
{
$db1 = db();
$replace = ' IF NOT EXISTS '.$neutab.' ';
$erg = $db1->execute("SHOW CREATE TABLE $orgtab ");
$create=$erg[1]['Create Table'];
$start=strpos($create, $orgtab);
$len=strlen($orgtab);
$create=substr_replace($create, $replace, $start-1, $len+2);
$db1->execute($create);
}
Der Funktion werden die Namen der Ursprungstabelle und der zu erstellenden Tabelle übergeben.
function copy_table($orgtab, $neutab)

Verbinden zur Datenbank

$db1 = db();

Den String zusammensetzen, mit dem der SQL-String zum Erstellen der neuen Tabelle geändert werden soll.

$replace = ' IF NOT EXISTS '.$neutab.' ';

Den SQL-String zum Erstellen der Ursprungstabelle abfragen.

$erg = $db1->execute("SHOW CREATE TABLE $orgtab ");

Den SQL-String zum Erstellen der Ursprungstabelle $create zuweisen.

$create=$erg[1]['Create Table'];

Suchen der Position des Tabellennamens der Ursprungstabelle in $create, um diesen Ersetzen zu können.

$start=strpos($create, $orgtab);

Die Länge des Tabellennamens ermitteln

$len=strlen($orgtab);

Ersetzen des alten Tabellennamens mit dem neuen Tabellennamen + IF NOT EXISTS

$create=substr_replace($create, $replace, $start-1, $len+2);

Ausführen des geänderten SQL-Strings, so dass die neue Tabelle erstellt wird.

$db1->execute($create);

Hinweise:

  • Dieses Verfahren geht natürlich auch bei MySQL-Versionen nach 4.1.
  • Alle Indexe werden auch in der neuen Tabelle angelegt.

Suchbegriffe

  • mysql tabelle kopieren
  • php mysql tabelle kopieren
  • php tabelle kopieren
  • mysql tabellen kopieren

3 Kommentare

  • 1
    Paul:

    Ahoi, ich bin mal so frei und poste was auf der Seite. Sieht schnieke aus! Ich bin auch seit einige Zeit mit WordPress beschaeftigt einige Dinge verstehe ich aber noch nicht so ganz. Deine Seite ist mir da immer eine tolle Motivation. Weiter so!

  • 2
    ITSD:

    Warum so kompliziert?

    CREATE TABLE IF NOT EXISTS tabelle_neu LIKE tabelle_alt;
    INSERT INTO tabelle_neu
    SELECT *
    FROM tabelle_alt;

    Mfg ITSD

  • 3
    Andre:

    Wie geschrieben, CREATE TABLE LIKE geht erst ab MYSQL-Version 4.1, Deswegen so kompliziert.
    Weiterhin werden bei CREATE TABLE LIKE keine Indexe angelegt.