2009-07-03 16 views
1

Ich habe ein Skript, das riesige Daten in einer Tabelle abruft. Ich möchte eine mysqldump erstellen, um Daten in eine andere Datenbanktabelle mit verschiedenen Feldern einzufügen. Ich möchte das Format von phpMyAdmin, wo es wiederholt die INSERT INTO Tabelle Werte (Werte1), (Werte2), ... (Werte100); Wenn eine bestimmte Menge an Wertesätzen erreicht wird, hängt davon ab, was Sie einstellen.erstellen mysql dump wie phpMyAdmin

ex: Wenn ich 550 Datensätze habe und ich möchte die Daten von 100 geteilt werden, so dass ich 6 Sätze von INSERT INTO-Abfrage haben wird.

INSERT INTO tablename VALUES(value1), (value2), .... (value100); 
INSERT INTO tablename VALUES(value101), (value102), .... (value200); 
INSERT INTO tablename VALUES(value201), (value202), .... (value300); 
INSERT INTO tablename VALUES(value301), (value302), .... (value400); 
INSERT INTO tablename VALUES(value401), (value402), .... (value500); 
INSERT INTO tablename VALUES(value501), (value502), .... (value550); 

Antwort

0

Sie array_chunk() verwenden könnte, so etwas wie:

$toInsert = array('(values1)', '(values2)', '(values3)', '(values4)'); //etc. 

$sqlStart = 'INSERT INTO tablename (field1, field2, field3, etc) VALUES '; 
foreach (array_chunk($toInsert, 100) as $insertSet) { 
    $sql = $sqlStart . implode(', ', $insertSet); 
    //execute $sql 
} 

Sind Sie wirklich viel zu tun mit den Daten obwohl? Sie können vielleicht alles in SQL mit INSERT INTO table (field1, field2) SELECT somefield, somefield2 FROM another table

+0

Dank dafür tun. Haben Sie eine Idee, wie auto_increment Primärschlüssel auch in den Werten keinen Wert für Primärschlüssel verwenden? – christian

+0

Ich bin mir nicht sicher, was du meinst? Wenn Sie den Primärschlüssel aus dem INSERT weglassen, wird er für Sie erstellt, aber Sie müssen wahrscheinlich die Liste der einzufügenden Felder angeben, damit Sie festlegen können, welche Felder Sie weglassen möchten. –

+0

Danke nochmal. Ich muss Feldnamen einschließen und das Feld für Primärschlüssel weglassen. – christian

0

Während Sie die Zeilen abrufen, erhöhen Sie einen Zähler, und wenn er einen bestimmten Wert erreicht, muss er eine neue insert-Anweisung erstellen?

einige Code, (kein PHP für eine lange Zeit) möglicherweise nicht richtig sein, aber Sie werden wahrscheinlich die Idee

$i = 0; 
$insertstatements = array(); 
$currentinsertstatement; 

while ($temp = mysql_fetch_assoc($result)) { 
    // do something with the data 
    $insertpart = "(value_xxx)"; 
    if ($i % 100 == 0) { 
    // first value 
    if ($i != 0) $insertstatements[count($insertstatements)] = $currentinsertstatement; 
    $currentinsertstatement = "INSERT INTO tablename VALUES " . $insertpart; 
    } else { 
    $currentinsertstatement .= ", " . $insertpart; 
    // somewhere in the middle of the insert statement 
    } 
    $i++; 
} 
if ($i % 100 != 0) { 
    $insertstatements[count($insertstatements] = $currentinsertstatement; 
} 
1

Wenn Sie mit mysqldump und möchten Ausgabe mutiple Zeilen in einem einzigen Einsatz kommen , dann müssen Sie die --extended-insert Option verwenden:

mysqldump extended insert option

ich bin nicht sicher, es möglich ist, mit mysqldump angeben, um festzulegen, dass in jeder INSERT-Anweisung eine bestimmte Anzahl von Zeilen enthalten ist, erzeugt in Die Müllhalde. Stattdessen können Sie net_buffer_length (obwohl es nicht empfohlen wird, dass Sie es ändern) festlegen, so dass die tatsächliche Menge abhängig von den Daten in jeder Zeile variieren kann.

0

Sie definitiv Transaktionen für große Einsätze verwenden sollten, wenn Sie Ihre Speicher-Engine unterstützt sie (wie InnoDB):

BEGIN;
EINFÜGEN IN Tabellenname WERTE ...
INSERT INTO Tabellenname WERTE ...
COMMIT;

Wenn etwas schief geht, können Sie sicher die letzte Operation ROLLBACK, starten Sie Skript usw.