MySQL'de birden çok satır ekleme


349

Bir kerede birden fazla satır eklerseniz veritabanı sorgusu daha hızlı mıdır:

sevmek

INSERT....

UNION

INSERT....

UNION

(2-3000 satır gibi eklemem gerekiyor)


8
BİRLİĞİ seçimler içindir.
Jacob

1
Sıralar nasıl geliyor? MySQL Sorgu Tarayıcısına doğrudan SQL mi yazıyorsunuz veya PHP veya C # içinden mi yoksa başka bir şey mi kullanıyorsunuz? İkinci duruma
sığarsanız

İkinci bağlantı düzeltildi: MySQL Sorgularını Optimize
Edin

Yanıtlar:


1176

INSERTVALUESsözdizimi kullanan ifadeler birden çok satır ekleyebilir. Bunu yapmak için, her biri parantez içine alınmış ve virgülle ayrılmış birden çok sütun değeri listesi ekleyin.

Misal:

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

Kaynak


@RPK. Sana katılıyorum ama veri kaynağını bilmiyorum. Daha önce de yazdığım gibi, eğer bir dosyası varsa, cularis'in önerdiği gibi yük veri sözdizimini kullanırdım. :)
Nicola Cossu

kullanmak da mümkündür INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. Tabii ki, bu sadece farklı tablolardan eklenen değerlerin daha iyi olacaktır.
Zohar Peled

72
Yararlı referans, çünkü bazen basit sözdizimini unutuyorum.
Kaptan Hypertext

a, b ve c burada satırların içeriğini depolayan geçici değişkenler midir?
Lealo

3
@Lealo no, değerleri aynı sırayla ekleyeceğiniz tablo sütun adlarıdır.
BeetleJuice

60

Verileriniz bir metin dosyasında bulunuyorsa, VERİ YÜKLEME YÜKLEME'yi kullanabilirsiniz .

Bir metin dosyasından tablo yüklerken, VERİ YÜKLEME YÜKLE seçeneğini kullanın. Bu genellikle INSERT ifadelerini kullanmaktan 20 kat daha hızlıdır.

INSERT İfadelerini Optimize Etme

Yukarıdaki bağlantıda ekleme ifadelerinizi nasıl hızlandıracağınıza ilişkin daha fazla ipucu bulabilirsiniz.


3
Yinelenen kayıtlar ne olacak?
Matteo

2
@Matteo Kopyaları, tanımladığınız şemaya göre veritabanı tarafından eklenir veya reddedilir.
ankush981

MySQL Multiqueries kullanın
Francisco Yepes Barrera

1
İkinci bağlantı 404.
dimir

1
Kırık bağlantı "Ekleme Hızı ifadeleri" şu anda kapsanmaktadır: INSERT İfadelerini Optimize Etme .
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;

3
Bu, daha fazla oyu hak ediyor, bunu kullanarak diğer tablolardan alınan verileri toplu olarak ekleyebilirsiniz
Novastorm

4
Eğer bu kod parçasında ne olduğuna dair bir açıklama olsaydı, "diğer tablolardan alınan verileri toplu olarak
eklemem

0

İşte: m (çoktan çoğa ilişki) tablosuyla kullanıma hazır bir PHP çözümü:

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

İmplode () kullanmak "son karakter" sorununu atlatır, ancak büyük bir bellek yükü oluşturur. 3000 satır istedi, her satırda 1kb veri olduğunu hayal edin, bu zaten 3MB ham veri. Dizi $ table_1 'dan başka bir 30MB daha tükettiği için 30MB bellek alacaktır, böylece script 60MB kullanacaktır. Sadece söylemek, aksi takdirde iyi bir çözüm
John

benim durumum için faydalıdır.
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')";

Bu yanıtı karıştırmanın yanı sıra, PHP kullandığınızı varsayarak SQL enjeksiyonuna karşı da savunmasız olabilirsiniz.
ultrafez

2
1. SQL kodunuzda hata var. 2. Bir sonraki $ sql değeri önceki $ sql değerinin yerini alacaktır.
Marwan Salim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.