MySQL'de toplu ekleme nasıl yapılır


148

Bir tabloya girilmesi gereken 1-çok sayıda kayıt var. Bunu bir sorguda yapmanın en iyi yolu nedir? Sadece bir döngü oluşturmalı ve yineleme başına bir kayıt eklemeli miyim? Yoksa daha iyi bir yol var mı?


1
Bir ifadeyi veya işlevi kullanmaya başlamadan önce lütfen belgeleri okuyun. INSERTbunu doğal olarak destekliyor !
Orbit'te

3
Gerçekten çok sayıda kaydınız varsa ve bunları bir CSV dosyası olarak biçimlendirebilirseniz, LOAD DATA INFILE deyimine veya mysqlimport komutuna bakın.
squawknull

Kayıt için LOAD DATA , CSV girişi gerektirmeyen çok esnek bir komuttur ; herhangi bir metin biçimi yapar ve giriş verilerini ayrıştırmak ve değiştirmek için bir dizi yardımcı parametre vardır. Bu kesinlikle yerel bir db veri yüklemek için en hızlı yoludur. Yukarıda "en iyi" ile ne kastedildiği açık değildir: yani basitliğin (INSERT deyimlerini kullan) hızı düşürüp düşürmediği (LOAD DATA kullanın).
EdwardGarson

Yanıtlar:


298

Gönderen MySQL kılavuzuna

VALUES sözdizimini kullanan INSERT deyimleri 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);

7
Bu Veri Yükleme Dosyasından daha yavaş mı?
srchulo

saklı yordamda bu insert deyimi yazmak için sözdizimi nedir?
Nitin Sawant

@Nitin aynı sözdizimi olmaz mı? Yine de SQL Server'da yapacağım şey bu.
Reklamlar

13
Soru " Toplu ekler nasıl yapılır" olarak etiketlenirken bu cevabın gerçekten toplu ek olduğunu lütfen unutmayın . Toplu genellikle daha hızlıdır, bu soruya
Mike Demenok

2
@Lukman'dan gelen bu SO yanıtı başına , eklenebilecek değerlerin / satırların sayısı ile sınırlıdırmax_allowed_packet
Sepster

22

Çoğu zaman, bir MySQL istemcisinde çalışmıyorsunuz ve uygun API'yı kullanarak ekleri toplu olarak kullanmalısınız.

Örneğin JDBC'de:

connection con.setAutoCommit(false); 
PreparedStatement prepStmt = con.prepareStatement("UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
prepStmt.setString(1,mgrnum1);                 
prepStmt.setString(2,deptnum1);
prepStmt.addBatch();

prepStmt.setString(1,mgrnum2);                        
prepStmt.setString(2,deptnum2);
prepStmt.addBatch();

int [] numUpdates=prepStmt.executeBatch();

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvbtupd.htm


5
Toplu ekler hakkında iyi bir blog girişi (Java'da, ancak herhangi bir dil ile ilgilidir): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur


6

Veri yükleme sorgusu çok daha iyi bir seçenektir, ancak godaddy gibi bazı sunucular paylaşılan barındırmada bu seçeneği kısıtlar, bu nedenle yalnızca iki seçenek kaldı, her yineleme veya toplu ekleme için kayıt ekleyin, ancak sorgunuz bunu aşarsa toplu ekleme karakter sınırlaması vardır mysql'de ayarlanan karakter sayısı daha sonra sorgunuz kilitlenir, Bu yüzden toplu ekleme ile parçalar halinde veri eklemenizi öneririz, bu veritabanı ile kurulan bağlantı sayısını en aza indirir.


1
Nasıl olurLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j

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.