Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menambahkan lebih dari satu baris dengan Zend_Db?

Saya tidak berpikir Zend_Db mendukung penyisipan beberapa baris.

Tetapi jika Anda hanya memiliki dua baris atau lebih, Anda dapat menggunakan satu lingkaran saja.

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

Bill Karwin , mantan pengembang Zend Framework, menulis ini di Nabble beberapa waktu lalu :

Rowsets pada dasarnya adalah objek koleksi, jadi saya akan menambahkan metode ke kelas itu untuk memungkinkan baris ditambahkan ke set. Jadi Anda harus bisa melakukan ini:

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

Tidak masuk akal untuk meneruskan bilangan bulat ke createRowset() untuk membuat N baris kosong. Anda hanya perlu mengulanginya untuk mengisinya dengan nilai. Jadi, sebaiknya Anda menulis loop untuk membuat dan mengisi baris individual dengan data aplikasi, lalu menambahkannya ke koleksi.

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

Masuk akal untuk mengizinkan larik array diteruskan ke createRowset(), karena ini akan konsisten dengan penggunaan meneruskan Tuple ke createRow().

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

Ini akan melakukan pengulangan yang sama seperti contoh sebelumnya di atas (kecuali untuk save() di akhir), membuat baris baru dari baris baru, siap untuk disimpan()d.

Ada dua cara dalam SQL untuk meningkatkan efisiensi penyisipan data:

  1. Gunakan pernyataan INSERT tunggal dengan beberapa baris:

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

  2. Siapkan pernyataan INSERT dan jalankan beberapa kali:

    SIAPKAN INSERT INTO t (col1, col2, col3) NILAI (?, ?, ?);EXECUTE 1, 2, 3EXECUTE 4, 5, 6EXECUTE 7, 8, 9

Namun, mendukung salah satu dari peningkatan ini akan menambah kompleksitas pada kelas Row dan Rowset. Ini karena cara internal kelas Zend_Db_Table_Row saat ini membedakan antara baris yang perlu DIMASUKKAN atau DIPERBARUI saat Anda memanggil save(). Perbedaan ini dienkapsulasi oleh objek Row, sehingga Rowset tidak tahu apakah baris individual adalah baris baru atau salinan yang dimodifikasi dari baris yang ada. Oleh karena itu agar kelas Rowset menawarkan metode save() multi-baris yang menggunakan SQL yang lebih efisien, pengelolaan data kotor harus benar-benar difaktorkan ulang. Solusi yang lebih mudah adalah agar Rowset mengulangi barisnya, memanggil save() pada masing-masing baris. Ini lebih baik untuk enkapsulasi OO, meskipun tidak membantu mengoptimalkan SQL untuk menyisipkan rowset.

Bagaimanapun, sangat jarang memuat banyak baris data dalam permintaan web biasa, ketika ada kebutuhan terbesar untuk SQL yang efisien. Perbedaan efisiensi untuk sejumlah kecil baris kecil, jadi ini akan menjadi peningkatan yang nyata hanya jika Anda memuat banyak baris dalam jumlah besar. Jika demikian, Anda tidak boleh menggunakan INSERT, Anda harus menggunakan pernyataan LOAD DATA MySQL, atau fitur yang setara jika Anda menggunakan merek RDBMS lain. INSERT biasanya bukan pilihan yang paling efisien untuk memuat banyak data.

Mengenai mengembalikan kunci yang dibuat secara otomatis, saya tidak akan repot. Perhatikan bahwa jika Anda menggunakan SQL biasa (dalam CLI mysql misalnya), dan Anda menyisipkan beberapa baris dalam satu pernyataan INSERT, Anda hanya bisa mendapatkan nilai id yang dihasilkan terakhir, bukan nilai id untuk semua baris yang dimasukkan. Ini adalah perilaku SQL; itu berlaku untuk bahasa apa pun atau kerangka kerja apa pun.

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

Jika Anda membutuhkan id untuk setiap baris, Anda harus menulis loop dan menyisipkan baris satu per satu, mengambil id yang dihasilkan setelah setiap baris dimasukkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kueri dinamis menggunakan nomor variabel argumen IN (p1, p2, p3)

  2. Menghapus baris dengan MySQL LEFT JOIN

  3. MySQL ORDER BY Date field yang tidak dalam format tanggal

  4. Hasil DAO.Recordset.Update di kunci rekaman

  5. LAST_INSERT_ID() mengembalikan beberapa baris 0?