MySQL - tôi có thể chèn bao nhiêu hàng trong một câu lệnh INSERT?


91

Nó có phụ thuộc vào số bộ giá trị không? Nó có phụ thuộc vào số byte trong câu lệnh INSERT không?

Câu trả lời:


93

Bạn có thể chèn vô số bản ghi bằng cách sử dụng INSERT ... SELECTmẫu, miễn là bạn có các bản ghi đó hoặc một phần của, trong các bảng khác.

Nhưng nếu bạn đang mã hóa cứng các giá trị bằng cách sử dụng INSERT ... VALUESmẫu, thì sẽ có giới hạn về độ lớn / dài của câu lệnh của bạn: max_allowed_packet giới hạn độ dài của câu lệnh SQL do máy khách gửi đến máy chủ cơ sở dữ liệu và nó ảnh hưởng đến bất kỳ loại truy vấn nào và không chỉ cho câu lệnh INSERT.


44

Lý tưởng nhất, Mysql cho phép tạo vô số hàng trong một lần chèn (cùng một lúc) nhưng khi

Máy khách MySQL hoặc máy chủ mysqld nhận được một gói lớn hơn max_allowed_packet byte, nó phát ra lỗi Gói quá lớn và đóng kết nối.

Để xem giá trị mặc định cho biến max_allowed_packet là gì, hãy thực hiện lệnh sau trong MySQL:

show variables like 'max_allowed_packet';

Cài đặt MySQL tiêu chuẩn có giá trị mặc định là 1048576 byte (1MB). Điều này có thể được tăng lên bằng cách đặt nó thành giá trị cao hơn cho một phiên hoặc kết nối.

Điều này đặt giá trị thành 500MB cho mọi người (đó là ý nghĩa của GLOBAL):

SET GLOBAL max_allowed_packet=524288000;

kiểm tra sự thay đổi của bạn trong thiết bị đầu cuối mới với kết nối mới:

show variables like 'max_allowed_packet';

Bây giờ nó sẽ hoạt động mà không có bất kỳ lỗi nào cho chèn bản ghi vô hạn. Cảm ơn


11
500 MB không phải là vô hạn. Nó lớn hơn nhiều so với giá trị mặc định, nhưng vẫn không phải là vô hạn.
Carlos2W

Một câu hỏi: chính xác thì giới hạn này là gì? Truy vấn chính nó? Điều gì về dữ liệu, ràng buộc khi thực hiện câu lệnh? Tôi có thể được an toàn, cho đến khi strlen($query_with_questionmarks) < $max_alloweed_packet?
pilat

Nếu bạn đang cố gắng đặt nó thành giá trị lớn nhất có thể, đó là 1GB sẽ trông giống như sau: SET GLOBAL max_allowed_packet = 1073741824
PHP Guru



6

Bạn có thể chèn vô số hàng bằng một câu lệnh INSERT. Ví dụ, bạn có thể thực thi một thủ tục được lưu trữ có một vòng lặp được thực thi hàng nghìn lần, mỗi lần chạy một truy vấn CHÈN.

Hoặc INSERT của bạn có thể ngắt một trình kích hoạt mà chính nó thực hiện một INSERT. Chuyến đi nào khác kích hoạt. Và như thế.

Không, nó không phụ thuộc vào số lượng bộ giá trị. Nó cũng không phụ thuộc vào số lượng byte.

Có giới hạn về mức độ lồng sâu trong dấu ngoặc đơn của bạn và giới hạn về tổng thời lượng câu lệnh của bạn. Trớ trêu thay, cả hai đều được tham chiếu trên thedailywtf.com. Tuy nhiên, cả hai phương tiện tôi đề cập ở trên đều vượt qua những giới hạn này.


Ví dụ của bạn là dành cho việc chạy nhiều INSERT, và nó không hiển thị khoảng cách chèn nhiều hàng trong một câu lệnh INSERT ..
Lukman

@Lukman: Một truy vấn INSERT có thể dẫn đến nhiều INSER đánh vào cơ sở dữ liệu. Vấn đề chỉ là ai đếm những gì.
Borealid

2
Đúng vậy, nhưng ví dụ đầu tiên của bạn cho thấy về việc chạy truy vấn trong một vòng lặp với mỗi vòng lặp chạy một câu lệnh INSERT và nó không nói gì về một câu lệnh INSERT chèn nhiều hàng. nó chỉ là một vấn đề nhấn mạnh.
Lukman

Không ai có thể làm bất cứ điều gì vô hạn. Luôn luôn có giới hạn tài nguyên.
Adrien

Điều này có áp dụng cho câu lệnh SELECT ... FROM không? Ý tôi là nếu dữ liệu đã được chèn ngay từ đầu với max_allowed_packet, thì đây cũng không nên được chọn sau đó ?. Tôi không hiểu tại sao nó được áp dụng cho tất cả các tuyên bố khác như người đăng khác đã nói khi nó lần đầu tiên phải được chèn trước bất kỳ thứ gì khác.
Thielicious


2

Tôi tin rằng không có số hàng xác định mà bạn bị giới hạn để chèn mỗi INSERT, nhưng có thể có một số loại kích thước tối đa cho các truy vấn nói chung.


2

Nó bị giới hạn bởi max_allowed_packet.
Bạn có thể chỉ định bằng cách sử dụng: mysqld --max_allowed_packet=32M Theo mặc định, nó là 16M.
Bạn cũng có thể chỉ định trong my.cnf trong / etc / mysql /

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.