MySQL - tek bir INSERT deyimine kaç satır ekleyebilirim?


91

Değer kümelerinin sayısına bağlı mı? INSERT ifadesindeki bayt sayısına bağlı mı?

Yanıtlar:


93

INSERT ... SELECTDiğer tablolarda bu kayıtlara veya bunların bir kısmına sahip olmanız koşuluyla, desen kullanarak sonsuz sayıda kayıt ekleyebilirsiniz .

Ancak INSERT ... VALUES, desen kullanarak değerleri sabit kodluyorsanız , ifadenizin ne kadar büyük / uzun olduğuna dair bir sınır vardır: max_allowed_packet, bu da istemci tarafından veritabanı sunucusuna gönderilen SQL ifadelerinin uzunluğunu sınırlar ve her tür sorguyu etkiler. ve sadece INSERT ifadesi için değil.


44

İdeal olarak, Mysql, tek eklemede (bir kerede) sonsuz sayıda satır oluşturmaya izin verir, ancak

MySQL istemcisi veya mysqld sunucusu max_allowed_packet bayttan daha büyük bir paket alır, çok büyük bir Paket hatası verir ve bağlantıyı kapatır.

Max_allowed_packet değişkeni için varsayılan değerin ne olduğunu görmek için MySQL'de aşağıdaki komutu yürütün:

show variables like 'max_allowed_packet';

Standart MySQL kurulumunun varsayılan değeri 1048576 bayttır (1MB). Bu, bir oturum veya bağlantı için daha yüksek bir değere ayarlanarak artırılabilir.

Bu, değeri herkes için 500 MB olarak ayarlar (GLOBAL'ın anlamı budur):

SET GLOBAL max_allowed_packet=524288000;

Yeni bağlantı ile yeni terminaldeki değişikliğinizi kontrol edin:

show variables like 'max_allowed_packet';

Sonsuz kayıt eklemek için artık hatasız çalışması gerekir. Teşekkürler


11
500 MB sonsuz değil. Varsayılan değerden çok daha büyük, ancak yine de sonsuz değil.
Carlos2W

Soru: Bu sınır tam olarak ne için? Sorgunun kendisi mi? Peki ya veriler, ifadeyi çalıştırırken bağlanır mı? Güvende olabilir miyim strlen($query_with_questionmarks) < $max_alloweed_packet?
pilat

Mümkün olan en büyük değere, yani 1 GB'a ayarlamaya çalışıyorsanız, şuna benzer: SET GLOBAL max_allowed_packet = 1073741824
PHP Guru



6

Bir INSERT ifadesiyle sonsuz sayıda satır ekleyebilirsiniz. Örneğin, her seferinde bir INSERT sorgusu çalıştıran bir döngüye sahip olan bir saklı yordamı çalıştırabilirsiniz.

Veya INSERT'iniz, kendisi bir INSERT gerçekleştiren bir tetikleyiciyi açabilir. Hangi başka bir tetikleyiciyi tetikler. Ve bunun gibi.

Hayır, değer kümelerinin sayısına bağlı değildir. Bayt sayısına da bağlı değildir.

Parantezlerinizin ne kadar derinlemesine yerleştirilmiş olabileceğinin bir sınırı ve toplam ifadenizin ne kadar uzun olduğunun bir sınırı vardır. İkisine de ironik bir şekilde thedailywtf.com'da atıfta bulunulmaktadır. Ancak yukarıda bahsettiğim her iki yöntem de bu sınırları aşıyor.


Örnekleriniz birden çok INSERT çalıştırmak içindir ve bir INSERT deyimine birden çok satır eklemeyi göstermez ..
Lukman

@Lukman: Bir INSERT sorgusu, veritabanına birden çok INSERTS isabet etmesine neden olabilir. Bu sadece kimin neyi saydığı meselesi.
Borealid

2
doğrudur, ancak ilk örneğiniz, her döngüde bir INSERT ifadesi çalıştıran bir döngüde sorgu çalıştırmayı gösterir ve birden çok satır ekleyen bir INSERT ifadesi hakkında hiçbir şey söylemez. bu sadece bir vurgu meselesi.
Lukman

Hiç kimse sonsuz bir şey yapamaz. Her zaman kaynak sınırları vardır.
Adrien

Bu SELECT ... FROM ifadesi için de geçerli mi? Demek istediğim, eğer veri max_allowed_packet ile ilk sırada eklenmişse, bundan sonra da seçilmek zorunda değil mi? Neden başka bir şeyden önce eklenmesi gerektiğinde diğer posterin söylediği gibi diğer tüm ifadelere uygulandığını anlamıyorum.
Thielicious


2

INSERT başına eklemekle sınırlı tanımlı satır sayısı olmadığına inanıyorum, ancak genel olarak sorgular için bir tür maksimum boyut olabilir.


2

Max_allowed_packet ile sınırlıdır.
Şunları kullanarak belirtebilirsiniz: mysqld --max_allowed_packet=32M Varsayılan olarak 16M'dir.
/ Etc / mysql / içindeki my.cnf dosyasında da belirtebilirsiniz.

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.