Làm thế nào để thực hiện một đợt chèn trong MySQL


148

Tôi có 1-nhiều số lượng hồ sơ cần phải được nhập vào một bảng. Cách tốt nhất để làm điều này trong một truy vấn là gì? Tôi có nên tạo một vòng lặp và chèn một bản ghi cho mỗi lần lặp không? đây có phải là cách tốt hơn không?


1
Vui lòng đọc tài liệu cho một tuyên bố hoặc chức năng trước khi thử sử dụng nó. INSERThỗ trợ này nguyên bản !
Các cuộc đua nhẹ nhàng trong quỹ đạo

3
Nếu bạn có số lượng bản ghi thực sự lớn và có thể định dạng chúng dưới dạng tệp CSV, hãy xem câu lệnh LOAD DATA INFILE hoặc lệnh mysqlimport.
squawknull

Đối với bản ghi, LOAD DATA là một lệnh rất linh hoạt không yêu cầu đầu vào CSV; bất kỳ định dạng văn bản nào cũng được, và có một số tham số hữu ích để phân tích cú pháp và thao tác dữ liệu đầu vào. Đây chắc chắn là cách nhanh nhất để tải dữ liệu vào một db cục bộ. Không rõ nghĩa của "tốt nhất" ở trên là gì: tức là liệu tính đơn giản (sử dụng câu lệnh INSERT) có vượt quá tốc độ hay không (sử dụng LOAD DATA).
EdwardGarson

Câu trả lời:


298

Từ hướng dẫn sử dụng MySQL

Các câu lệnh INSERT sử dụng cú pháp GIÁ TRỊ có thể chèn nhiều hàng. Để làm điều này, bao gồm nhiều danh sách các giá trị cột, mỗi giá trị được đặt trong dấu ngoặc đơn và được phân tách bằng dấu phẩy. Thí dụ:

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

7
Đây có phải là chậm hơn tải dữ liệu Infile?
srchulo

cú pháp để viết câu lệnh chèn này trong thủ tục lưu trữ là gì?
Cưa Nitin

@Nitin sẽ không phải là cùng một cú pháp .. ??? Đó là những gì tôi sẽ làm trong SQL Server.
Quảng cáo

13
Xin lưu ý rằng trong khi câu hỏi được gắn nhãn "Cách thực hiện chèn hàng loạt " thì câu trả lời này thực sự là chèn số lượng lớn . Số lượng lớn thường nhanh hơn, xem câu hỏi này
Mike Demenok

2
@Koffeehaus Mỗi câu trả lời SO này từ @Lukman, số lượng giá trị / hàng có thể được chèn bị giới hạn bởimax_allowed_packet
Sepster

22

Hầu hết thời gian, bạn không làm việc trong máy khách MySQL và bạn nên chèn hàng loạt với nhau bằng API thích hợp.

Ví dụ: trong JDBC:

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
Một mục blog tốt về chèn hàng loạt (bằng Java, nhưng nó có liên quan đến bất kỳ ngôn ngữ nào): viruspatel.net/bloss/batch-insert-in-java-jdbc
Kangur


6

Tải truy vấn infile dữ liệu là tùy chọn tốt hơn nhiều nhưng một số máy chủ như godaddy hạn chế tùy chọn này trên lưu trữ chia sẻ, do đó, chỉ còn hai tùy chọn sau đó là một bản ghi chèn trên mỗi lần lặp hoặc chèn hàng loạt, nhưng chèn hàng loạt có giới hạn ký tự nếu truy vấn của bạn vượt quá điều này số lượng ký tự được đặt trong mysql thì truy vấn của bạn sẽ bị sập


1
Còn vềLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j

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.