2012-04-07 16 views
0

Ich habe eine riesige Tabelle von einem MySQL-db, ich möchte eine neue Tabelle in verschiedenen MySQL-DB erstellen und kopieren Sie 3 Spalten aus dem großen. Um das zu tun, schrieb ich den folgenden Code:Erstellen neuer Tabelle mit implode

$result = mysql_query("SELECT * FROM huge_table", $hugeDB); 
    $count = mysql_result($result, 0); 
    $iterations=ceil($count/500);  

    for($i=1; $i<=$iterations; $i++) 
    { 
     $start = ($i-1)*500; 
     $query = mysql_query("SELECT col1, col3, col6 FROM huge_table LIMIT $i, 500", $hugeDB); 
     $results = array(); 
     $j = 0; 
     while($result = mysql_fetch_array($query)) { 
      $result[$j]= '('.$result['col1'].', '.$result['col3'].', '.$result['col6'].')'; 
      $j++; 
     } 
     print_r($results); 
     $a = mysql_query("INSERT INTO less_huge_table (col1, col3, col6) VALUES ".implode(',', $results), $localDB); 
     if(!$a) die(mysql_error()."\n"); 
    } 

Aber dann ist der Ausgang:

Unknown column 'BTFG' in 'field list' 

Wo BTFG ist die Sache des des Arrays erste Element:

(2007-01-03, BTFG, 23.0481) 

Ich glaube, ich Ich mache einen kleinen Fehler, aber ich konnte nicht fangen.

Wie soll ich dieses Problem lösen?

Dank

Antwort

1

Ihr Array ist $result nicht $resullts. Sie haben das Array mit $results deklariert, dann die Werte in $result zugewiesen und im Einfügen verwenden Sie $results, das leer ist.

sollte es

while($result = mysql_fetch_array($query)) { 
    $results[$j]= '("'.$result['col1'].'", "'.$result['col3'].'", "'.$result['col6'].'")'; 
    .... 
    } 

BTW, was ist $j++ nirgendwo anders verwendet.

EDIT:

Gänsefüsschen und String-Werte richtig:

('2007-01-03', 'BTFG', 23.0481) 

ändern:

$results[$j]= '("'.$result['col1'].'", "'.$result['col3'].'", "'.$result['col6'].'")'; 
+0

können Sie meine Bearbeitung bitte sehen? – CanCeylan

+0

siehe aktualisierte Antwort –

+0

vielen Dank! – CanCeylan

2

Sie können es in einem single query mit MySQL tun:

INSERT INTO less_huge_table (col1, col3, col6) 
    SELECT col1, col3, col6 
    FROM huge_table 

Dadurch müssen die Werte nicht mehr über ein Skript gerundet werden. Außerdem ist Ihr Code anfällig für SQL-Injection-Angriffe. Obwohl Sie diese Daten direkt aus der Datenbank erhalten haben, kann es noch sql Metazeichen enthalten, die Sie dann blind in eine andere Abfrage stopfen. Ja, es ist insgesamt möglich, sich selbst zu injizieren.

+0

Aber während ich diese Abfrage ausführen, welche Verbindung sollte aktiv sein? Wenn zum Beispiel die localDB-Verbindung aktiv ist, kann ich die Daten in der huge_table nicht erreichen. – CanCeylan

+0

Diese Abfrage sperrt die Tabellen nur, wenn Sie die Sperren explizit erstellen. –

+0

Aber welche DB soll ich verbinden? Wenn ich eine Verbindung zu localDB herstelle, wenn ich FROM huge_table sage, heißt es Tabelle huge_table existiert nicht – CanCeylan

1

Es könnte einfacher und schneller sein, dies vollständig mit einer MySQL-Anweisung zu tun, und Sie müssen nicht zwei Verbindungen verwenden, vorausgesetzt, Ihre Datenbanken befinden sich auf demselben Server und die Anmeldeinformationen sind identisch oder autorisiert.

Zum Beispiel: -

mysql_query('INSERT INTO less_huge_table (col1, col3, col6) SELECT col1, col3, col6 FROM huge_table LIMIT $i, 500', $hugeDB); 

Wenn Sie wirklich die Daten dann über zu einer lokalen Datenbank auf einem anderen Server benötigen, fragen Sie einfach das System wieder für Ihre less_huge_table nur. Dies verhindert, dass Sie Ihre Informationen in PHP eingeben müssen und sicherstellen müssen, dass Sie fliehen und es ordnungsgemäß an die neue insert-Anweisung zurückgeben. MySQL wird es für Sie von Tabelle zu Tabelle behandeln.

Auf der Grundlage Ihres obigen Codes ist es jedoch möglich, dass nicht maskierte Daten aus der riesigen Tabelle stammen, die Ihre Abfrage unterbricht. Das "Array()" würde von Ihrem print_r-Befehl und dem Fehler vom nächsten Einfügefehler stammen.So können Sie Ihre SQL-Anweisung immer nur ausdrucken, anstatt sie auszuführen und direkt zu überprüfen.

+0

Danke Jason, ich bin neu hier. Ich werde daran denken, das nächste Mal zu formatieren. – matthewnreid

Verwandte Themen