Memasukkan beberapa baris dalam mysql

349

Apakah permintaan basis data lebih cepat jika saya memasukkan banyak baris sekaligus:

Suka

INSERT....

UNION

INSERT....

UNION

(Saya perlu memasukkan 2-3000 baris)

Emma
sumber
8
UNION untuk pemilihan.
Yakub
1
Bagaimana barisannya datang? Apakah Anda langsung menulis SQL pada MySQL Query Browser atau menggunakan dari dalam PHP atau C # atau yang lainnya. Jika Anda cocok dengan kasus yang terakhir, maka periksa tautan berikut: Cara Tercepat untuk Menyisipkan Rekaman Cepat
RKh
Memperbaiki tautan kedua: Optimalkan Permintaan MySQL - Sisipan Cepat dengan Banyak Baris
Pavel Shkleinik

Jawaban:

1176

INSERTpernyataan yang menggunakan VALUESsintaksis dapat menyisipkan banyak baris. Untuk melakukan ini, sertakan beberapa daftar nilai kolom, masing-masing terlampir di dalam tanda kurung dan dipisahkan dengan koma.

Contoh:

INSERT INTO tbl_name
    (a,b,c)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

Sumber

Nicola Cossu
sumber
@RPK. Saya setuju dengan Anda tetapi saya tidak tahu sumber datanya. Seperti yang sudah saya tulis, jika dia memiliki file, saya akan menggunakan sintaks memuat data seperti yang disarankan cularis. :)
Nicola Cossu
itu juga mungkin untuk digunakan INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. tentu saja, ini hanya akan lebih baik dari nilai yang dimasukkan berasal dari tabel yang berbeda.
Zohar Peled
72
Referensi yang membantu, karena kadang-kadang saya hanya lupa sintaksis yang sederhana.
Kapten Hypertext
Apakah a, b, dan c di sini variabel sementara yang menyimpan konten baris?
Lealo
3
@Lealo tidak, mereka adalah nama kolom tabel untuk memasukkan nilai dalam urutan yang sama.
BeetleJuice
60

Jika Anda memiliki data dalam file teks, Anda dapat menggunakan LOAD DATA INFILE .

Saat memuat tabel dari file teks, gunakan LOAD DATA INFILE. Ini biasanya 20 kali lebih cepat daripada menggunakan pernyataan INSERT.

Mengoptimalkan Pernyataan INSERT

Anda dapat menemukan lebih banyak kiat tentang cara mempercepat pernyataan sisipkan pada tautan di atas.

Yakub
sumber
3
Bagaimana dengan rekaman yang digandakan?
Matteo
2
@Matteo Duplicates akan dimasukkan atau ditolak oleh database berdasarkan skema yang telah Anda tentukan.
ankush981
Gunakan multiqueries mysql
Francisco Yepes Barrera
1
Tautan kedua 404.
dimir
1
Tautan yang rusak "Pernyataan Kecepatan Sisipan" sekarang tercakup dalam: Mengoptimalkan Pernyataan INSERT .
Kenneth M. Kolano
27
BEGIN;
INSERT INTO test_b (price_sum)
  SELECT price
  FROM   test_a;
INSERT INTO test_c (price_summ) 
  SELECT price
FROM   test_a;
COMMIT;
sunilsingh
sumber
3
Ini layak mendapatkan lebih banyak upvotes, dengan menggunakan ini Anda dapat memasukkan data secara massal yang diambil dari tabel lain
Novastorm
4
Andai saja ada penjelasan mengenai apa yang terjadi dalam potongan kode ini, mengingat bahwa saya harus "memasukkan data secara massal dari tabel lain" ...
Aleister Tanek Javas Mraz
0

Berikut ini adalah solusi PHP yang siap digunakan dengan tabel: m (hubungan banyak ke banyak):

// get data
$table_1 = get_table_1_rows();
$table_2_fk_id = 123;

// prepare first part of the query (before values)
$query = "INSERT INTO `table` (
   `table_1_fk_id`,
   `table_2_fk_id`,
   `insert_date`
) VALUES ";

//loop the table 1 to get all foreign keys and put it in array
foreach($table_1 as $row) {
    $query_values[] = "(".$row["table_1_pk_id"].", $table_2_fk_id, NOW())";
}

// Implode the query values array with a coma and execute the query.
$db->query($query . implode(',',$query_values));
Meloman
sumber
Menggunakan implode () tidak menghindari masalah "karakter terakhir" tetapi itu menciptakan overhead memori yang besar. Dia meminta 3000 baris, bayangkan setiap baris memiliki 1kb data, itu sudah 3MB data mentah. Array akan mengambil 30MB memori dia sudah mengkonsumsi 30MB lain dari $ table_1 sehingga skrip akan menggunakan 60MB. Hanya mengatakan, kalau tidak itu solusi yang baik
John
ini berguna untuk situasi saya.
Bilal Şimşek
-11
// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO product_cate (site_title, sub_title) 
  VALUES ('$site_title', '$sub_title')";

// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO menu (menu_title, sub_menu)
  VALUES ('$menu_title', '$sub_menu', )";

// db table name / blog_post /  menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO blog_post (post_title, post_des, post_img)
  VALUES ('$post_title ', '$post_des', '$post_img')";
Johirulla
sumber
Selain dari kebingungan respon ini, Anda juga mungkin rentan terhadap injeksi SQL, dengan asumsi Anda menggunakan PHP.
ultrafez
2
1. Ada bug dalam kode SQL Anda. 2. Nilai $ sql berikutnya akan menggantikan nilai $ sql sebelumnya.
Marwan Salim