Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie füge ich mehr als eine Zeile mit Zend_Db hinzu?

Ich glaube nicht, dass Zend_Db das Einfügen mehrerer Zeilen unterstützt.

Aber wenn Sie nur zwei Zeilen oder etwas mehr haben, können Sie einfach eine Schleife verwenden.

foreach ($data as $row)
{
    $db->insert('table', $row)
}

Bill Karwin , ein ehemaliger Entwickler des Zend Framework, schrieb dies auf Nabble vor einiger Zeit :

Rowsets sind im Grunde ein Sammlungsobjekt, also würde ich dieser Klasse Methoden hinzufügen, damit Zeilen zum Set hinzugefügt werden können. Sie sollten also in der Lage sein, dies zu tun:

// creates a rowset collection with zero rows
$rowset = $table->createRowset();

// creates one row with unset values 
$row = $table->createRow();

// adds one row to the rowset 
$rowset->addRow($row); 

// iterates over the set of rows, calling save() on each row
$rowset->save(); 

Es macht keinen Sinn, eine Ganzzahl an createRowset() zu übergeben, um N leere Zeilen zu erstellen. Sie müssten sie nur durchlaufen, um sie ohnehin mit Werten zu füllen. Sie können also genauso gut eine Schleife schreiben, um einzelne Zeilen mit Anwendungsdaten zu erstellen und zu füllen und sie dann der Sammlung hinzuzufügen.

$rowset = $table->createRowset();
foreach ($appData as $tuple) 
{
    $row = $table->createRow($tuple);
    $rowset->addRow($row);
}
$rowset->save();

Es ist sinnvoll, ein Array von Arrays an createRowset() übergeben zu lassen, da dies mit der Verwendung eines Tupels an createRow() konsistent wäre.

$rowset = $table->createRowset($appData); // pass array of tuples

Dies würde die gleiche Schleife wie im vorherigen Beispiel oben ausführen (mit Ausnahme von save() am Ende) und ein neues Rowset mit neuen Zeilen erstellen, bereit zum save()d.

In SQL gibt es zwei Möglichkeiten, die Effizienz beim Einfügen von Daten zu verbessern:

  1. Verwenden Sie eine einzelne INSERT-Anweisung mit mehreren Zeilen:

    INSERT INTO t (col1, col2, col3) WERTE (1, 2, 3), (4, 5, 6), (7, 8, 9);

  2. Bereiten Sie eine INSERT-Anweisung vor und führen Sie sie mehrmals aus:

    VORBEREITEN EINFÜGEN IN t (Spalte 1, Spalte 2, Spalte 3) WERTE (?, ?, ?); AUSFÜHREN 1, 2, 3 AUSFÜHREN 4, 5, 6 AUSFÜHREN 7, 8, 9

Die Unterstützung einer dieser Verbesserungen würde jedoch die Komplexität der Row- und Rowset-Klassen erhöhen. Dies liegt an der internen Art und Weise, wie die aktuelle Klasse Zend_Db_Table_Row zwischen einer Zeile unterscheidet, die INSERTiert oder AKTUALISIERT werden muss, wenn man save() aufruft. Diese Unterscheidung wird durch das Row-Objekt gekapselt, sodass das Rowset nicht weiß, ob die einzelnen Zeilen neue Zeilen oder geänderte Kopien vorhandener Zeilen sind. Damit die Rowset-Klasse eine mehrzeilige save()-Methode anbieten kann, die effizienteres SQL verwendet, müsste die Verwaltung von schmutzigen Daten vollständig umgestaltet werden. Die einfachere Lösung besteht darin, dass das Rowset seine Zeilen durchläuft und für jede einzelne save() aufruft. Dies ist besser für die OO-Kapselung, obwohl es nicht dabei hilft, SQL für das Einfügen eines Rowsets zu optimieren.

Auf jeden Fall kommt es wirklich selten vor, dass viele Datenzeilen in einer typischen Webanforderung massenhaft geladen werden, wenn der größte Bedarf an effizientem SQL besteht. Der Unterschied in der Effizienz für eine kleine Anzahl von Zeilen ist gering, daher wäre es nur dann eine merkliche Verbesserung, wenn Sie eine große Anzahl von Zeilen massenhaft laden. Wenn das der Fall ist, sollten Sie INSERT sowieso nicht verwenden, Sie sollten die LOAD DATA-Anweisung von MySQL oder eine gleichwertige Funktion verwenden, wenn Sie eine andere RDBMS-Marke verwenden. INSERT ist normalerweise nicht die effizienteste Wahl zum Laden vieler Daten.

In Bezug auf die Rückgabe automatisch generierter Schlüssel würde ich mich nicht darum kümmern. Beachten Sie, dass Sie, wenn Sie einfaches SQL verwenden (z. B. in der mysql-CLI) und mehrere Zeilen in eine einzelne INSERT-Anweisung einfügen, nur den zuletzt generierten ID-Wert erhalten können, nicht die ID-Werte für alle eingefügten Zeilen. Das ist SQL-Verhalten; es gilt für jede Sprache oder jedes Framework.

INSERT INTO t (col1, col2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
SELECT LAST_INSERT_ID(); -- returns only the id for the third tuple

Wenn Sie die ID für jede Zeile benötigen, sollten Sie eine Schleife schreiben und die Zeilen einzeln einfügen, wobei Sie die generierte ID nach jeder eingefügten Zeile abrufen.