Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да добавя повече от един ред със Zend_Db?

Не мисля, че Zend_Db поддържа вмъкване на множество редове.

Но ако имате само два реда или малко повече, можете просто да използвате цикъл.

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

Бил Карвин , бивш разработчик на Zend Framework, написа това в Nabble преди време :

Наборите от редове са основно обект за колекция, така че бих добавил методи към този клас, за да позволя на редовете да бъдат добавяни към набора. Така че трябва да можете да направите това:

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

Няма смисъл да предавате цяло число на createRowset(), за да създадете N празни реда. Просто ще трябва да ги повторите, за да ги попълните със стойности така или иначе. Така че можете също да напишете цикъл за създаване и попълване на отделни редове с данни от приложението и след това да ги добавите към колекцията.

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

Има смисъл да се позволи масив от масиви да се предава на createRowset(), тъй като това би било в съответствие с използването на подаване на кортеж към createRow().

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

Това ще изпълни същия цикъл като предишния пример по-горе (с изключение на save() в края), създавайки нов набор от нови редове, готови за save()d.

Има два начина в SQL за подобряване на ефективността на вмъкване на данни:

  1. Използвайте един израз INSERT с множество реда:

    ВМЕСЕТЕ В t (col1, col2, col3) СТОЙНОСТИ (1, 2, 3), (4, 5, 6), (7, 8, 9);

  2. Подгответе израз INSERT и го изпълнете няколко пъти:

    ПОДГОТОВЯТЕ ВМЪКВАНЕ НА t (col1, col2, col3) СТОЙНОСТИ (?, ?, ?); ИЗПЪЛНЕТЕ 1, 2, 3 ИЗПЪЛНЕТЕ 4, 5, 6 ИЗПЪЛНЕТЕ 7, 8, 9

Поддържането на някое от тези подобрения обаче би добавило сложност към класовете Row и Rowset. Това се дължи на вътрешния начин, по който текущият клас Zend_Db_Table_Row прави разлика между ред, който трябва да бъде INSERTed или UPDATED, когато извикате save(). Това разграничение е капсулирано от обекта Row, така че наборът от редове не знае дали отделните редове са нови редове или модифицирани копия на съществуващи редове. Следователно, за да може класът Rowset да предложи многоредов save() метод, който използва по-ефективен SQL, управлението на мръсни данни ще трябва да бъде напълно рефакторирано. По-лесното решение е наборът от редове да преглежда своите редове, като извиква save() за всеки от тях. Това е по-добре за OO капсулиране, въпреки че не помага за оптимизиране на SQL за вмъкване на набор от редове.

Във всеки случай, наистина рядко се зареждат много редове данни в типична уеб заявка, когато има най-голяма нужда от ефективен SQL. Разликата в ефективността за малък брой редове е малка, така че би било забележимо подобрение само ако зареждате огромен брой редове. Ако случаят е такъв, така или иначе не трябва да използвате INSERT, трябва да използвате израза LOAD DATA на MySQL или еквивалентна функция, ако използвате друга марка RDBMS. INSERT обикновено не е най-ефективният избор за зареждане на много данни.

Относно връщането на автоматично генерирани ключове, не бих се притеснявал. Забележете, че ако използвате обикновен SQL (например в mysql CLI) и вмъкнете няколко реда в един израз INSERT, можете да получите само последната генерирана стойност на идентификатор, но не и стойностите на id за всички вмъкнати редове. Това е SQL поведение; това е вярно за всеки език или всяка рамка.

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

Ако имате нужда от идентификатор за всеки ред, трябва да напишете цикъл и да вмъкнете редовете един по един, като извличате генерирания идентификатор след всеки вмъкнат ред.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Добавете сортиране по страници и търсене с помощта на jquery datatable

  2. Как да коригирам:Не е намерен подходящ драйвер за грешка jdbc:mysql://localhost/dbname при използване на пулове?

  3. получаване на стойността на допълнителна колона на централна таблица laravel

  4. MySQL - Поръчайте заявка и покажете един произволен ред в горната част

  5. Множество И условия MySQL