Mysql
 sql >> Database >  >> RDS >> Mysql

Come aggiungo più di una riga con Zend_Db?

Non credo che Zend_Db supporti l'inserimento di più righe.

Ma se hai solo due righe o poco più puoi semplicemente usare un loop.

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

Bill Karwin , un ex sviluppatore di Zend Framework, ha scritto questo su Nabble qualche tempo fa :

I set di righe sono fondamentalmente un oggetto di raccolta, quindi aggiungerei metodi a quella classe per consentire l'aggiunta di righe al set. Quindi dovresti essere in grado di farlo:

// 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(); 

Non ha senso passare un intero a createRowset() per creare N righe vuote. Dovresti solo scorrere tra di loro per popolarli comunque con valori. Quindi potresti anche scrivere un ciclo per creare e popolare singole righe con i dati dell'applicazione, quindi aggiungerle alla raccolta.

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

Ha senso consentire il passaggio di un array di array a createRowset(), poiché ciò sarebbe coerente con l'utilizzo del passaggio di una tupla a createRow().

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

Ciò eseguirebbe lo stesso ciclo dell'esempio precedente sopra (tranne save() alla fine), creando un nuovo set di righe di nuove righe, pronto per essere save()d.

Esistono due modi in SQL per migliorare l'efficienza dell'inserimento dei dati:

  1. Usa una singola istruzione INSERT con più righe:

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

  2. Prepara un'istruzione INSERT ed eseguila più volte:

    PREPARE INSERT IN t (col1, col2, col3) VALUES (?, ?, ?);ESEGUI 1, 2, 3ESEGUI 4, 5, 6ESEGUI 7, 8, 9

Tuttavia, il supporto di uno di questi miglioramenti aggiungerebbe complessità alle classi Row e Rowset. Ciò è dovuto al modo interno in cui l'attuale classe Zend_Db_Table_Row distingue tra una riga che deve essere INSERT o UPDATE quando si chiama save(). Questa distinzione è incapsulata dall'oggetto Row, quindi il Rowset non sa se le singole righe sono nuove righe o copie modificate di righe esistenti. Pertanto, affinché la classe Rowset offra un metodo save() a più righe che utilizzi un SQL più efficiente, la gestione dei dati sporchi dovrebbe essere completamente rifattorizzata. La soluzione più semplice è che il set di righe esegua un'iterazione sulle sue righe, chiamando save() su ciascuna di esse. Questo è meglio per l'incapsulamento OO, anche se non aiuta a ottimizzare SQL per l'inserimento di un set di righe.

In ogni caso, è davvero raro caricare in blocco molte righe di dati in una tipica richiesta Web, quando c'è la maggiore necessità di un SQL efficiente. La differenza di efficienza per un numero ridotto di righe è piccola, quindi sarebbe un notevole miglioramento solo se si carica in blocco un numero enorme di righe. In tal caso, non dovresti comunque utilizzare INSERT, dovresti utilizzare l'istruzione LOAD DATA di MySQL o una funzionalità equivalente se utilizzi un altro marchio RDBMS. INSERT di solito non è la scelta più efficiente per caricare molti dati.

Per quanto riguarda la restituzione di chiavi generate automaticamente, non mi preoccuperei. Si noti che se si utilizza SQL semplice (ad esempio nella CLI mysql) e si inseriscono più righe in una singola istruzione INSERT, è possibile ottenere solo l'ultimo valore id generato, non i valori id per tutte le righe inserite. Questo è il comportamento SQL; è vero per qualsiasi lingua o 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

Se hai bisogno dell'id per ogni riga, dovresti scrivere un loop e inserire le righe una alla volta, recuperando l'id generato dopo ogni riga inserita.