MySQL - berapa banyak baris yang dapat saya sisipkan dalam satu pernyataan INSERT?

91

Apakah itu tergantung pada jumlah kumpulan nilai? Apakah itu tergantung pada jumlah byte dalam pernyataan INSERT?

Luistar15
sumber

Jawaban:

93

Anda dapat menyisipkan rekaman dalam jumlah tak terhingga menggunakan INSERT ... SELECTpola, asalkan Anda memiliki rekaman tersebut, atau bagiannya, di tabel lain.

Tetapi jika Anda melakukan hard-coding nilai menggunakan INSERT ... VALUESpola, maka ada batasan seberapa besar / panjang pernyataan Anda: max_allowed_packet yang membatasi panjang pernyataan SQL yang dikirim oleh klien ke server database, dan itu memengaruhi semua jenis kueri dan tidak hanya untuk pernyataan INSERT.

Lukman
sumber
44

Idealnya, Mysql memungkinkan pembuatan baris dalam jumlah tak terbatas dalam satu sisipan (sekaligus) tetapi ketika a

Klien MySQL atau server mysqld menerima paket yang lebih besar dari byte max_allowed_packet, mengeluarkan paket kesalahan yang terlalu besar dan menutup koneksi.

Untuk melihat nilai default untuk variabel max_allowed_packet, jalankan perintah berikut di MySQL:

show variables like 'max_allowed_packet';

Instalasi MySQL standar memiliki nilai default 1048576 byte (1MB). Ini dapat ditingkatkan dengan mengaturnya ke nilai yang lebih tinggi untuk sesi atau koneksi.

Ini menetapkan nilainya menjadi 500MB untuk semua orang (itulah arti GLOBAL):

SET GLOBAL max_allowed_packet=524288000;

periksa perubahan Anda di terminal baru dengan koneksi baru:

show variables like 'max_allowed_packet';

Sekarang seharusnya berfungsi tanpa kesalahan untuk memasukkan catatan tak terbatas. Terima kasih

Raju akula
sumber
11
500 MB tidak terbatas. Ini jauh lebih besar dari nilai default, tapi tetap saja, tidak terbatas.
Carlos2W
Sebuah pertanyaan: untuk apa sebenarnya batasan ini? Kueri itu sendiri? Bagaimana dengan data, mengikat saat menjalankan pernyataan? Bisakah saya aman, sampai strlen($query_with_questionmarks) < $max_alloweed_packet?
pilat
Jika Anda mencoba mengaturnya ke nilai terbesar yang mungkin, yaitu 1GB yang akan terlihat seperti ini: SET GLOBAL max_allowed_packet = 1073741824
PHP Guru
23

Kueri secara max_allowed_packetumum dibatasi .

Dmytro Lytovchenko
sumber
6

Anda dapat menyisipkan baris dalam jumlah tak terbatas dengan satu pernyataan INSERT. Misalnya, Anda dapat menjalankan prosedur tersimpan yang memiliki loop yang dieksekusi ribuan kali, setiap kali menjalankan kueri INSERT.

Atau INSERT Anda bisa memicu pemicu yang melakukan INSERT sendiri. Yang memicu pemicu lain. Dan seterusnya.

Tidak, ini tidak bergantung pada jumlah kumpulan nilai. Juga tidak tergantung pada jumlah byte.

Ada batasan seberapa dalam tanda kurung Anda, dan berapa panjang total pernyataan Anda. Ironisnya, keduanya direferensikan di thedailywtf.com. Namun, kedua cara yang saya sebutkan di atas mengatasi batasan ini.

Borealid
sumber
Contoh Anda adalah untuk menjalankan beberapa INSERT, dan itu tidak menunjukkan tentang memasukkan beberapa baris dalam satu pernyataan INSERT ..
Lukman
@ Lukman: Satu kueri INSERT dapat mengakibatkan beberapa INSER masuk ke database. Ini hanya masalah siapa yang menghitung apa.
Borealid
2
benar, tetapi contoh pertama Anda menunjukkan tentang menjalankan kueri dalam satu loop dengan setiap loop menjalankan satu pernyataan INSERT, dan tidak mengatakan apa-apa tentang satu pernyataan INSERT yang menyisipkan beberapa baris. itu hanya masalah penekanan.
Lukman
Tidak ada yang bisa melakukan apapun tanpa batas. Selalu ada batasan sumber daya.
Adrien
Apakah ini juga berlaku untuk pernyataan SELECT ... FROM? Maksud saya jika data telah dimasukkan di tempat pertama dengan max_allowed_packet, bukankah ini harus dipilih setelah itu juga ?. Saya tidak mengerti mengapa itu diterapkan ke semua pernyataan lain seperti yang dikatakan poster lain ketika pertama kali harus disisipkan sebelum hal lain.
Thielicious
2

Saya yakin tidak ada jumlah baris yang dibatasi untuk Anda sisipkan per INSERT, tetapi mungkin ada semacam ukuran maksimum untuk kueri secara umum.

DMags
sumber
2

Itu dibatasi oleh max_allowed_packet.
Anda dapat menentukan dengan menggunakan: mysqld --max_allowed_packet=32M Ini secara default 16M.
Anda juga dapat menentukan di my.cnf di / etc / mysql /

linehrr
sumber