Chèn nhiều hàng trong mysql


349

Là truy vấn cơ sở dữ liệu nhanh hơn nếu tôi chèn nhiều hàng cùng một lúc:

giống

INSERT....

UNION

INSERT....

UNION

(Tôi cần chèn như 2-3000 hàng)


8
UNION là để lựa chọn.
Jacob

1
Làm thế nào các hàng đang đến? Bạn có đang trực tiếp viết SQL trên Trình duyệt truy vấn MySQL hoặc sử dụng từ bên trong PHP hoặc C # hoặc thứ gì khác không. Nếu bạn phù hợp với trường hợp sau, thì hãy kiểm tra các liên kết sau: Cách nhanh nhất để chèn 100k bản ghi chèn nhanh với nhiều hàng
RKh

Câu trả lời:


1176

INSERTcâu lệnh sử dụng VALUEScú pháp 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);

Nguồn


@RPK. Tôi đồng ý với bạn nhưng tôi không biết nguồn dữ liệu của cô ấy. Như tôi đã viết, nếu cô ấy có một tập tin, tôi sẽ sử dụng cú pháp tải dữ liệu như cularis gợi ý. :)
Nicola Cossu

nó cũng có thể sử dụng INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. tất nhiên, điều này sẽ chỉ tốt hơn trong các giá trị được chèn đến từ các bảng khác nhau.
Zohar Peled

72
Tài liệu tham khảo hữu ích, bởi vì đôi khi tôi chỉ quên cú pháp đơn giản.
Thuyền trưởng Hypertext

là a, b và c ở đây các biến tạm thời lưu trữ nội dung của các hàng?
Lealo

3
@Lealo không, chúng là tên cột trong bảng để chèn các giá trị theo cùng một thứ tự.
BeetleJuice

60

Nếu bạn có dữ liệu của mình trong tệp văn bản, bạn có thể sử dụng LOAD DATA INFILE .

Khi tải bảng từ tệp văn bản, hãy sử dụng LOAD DATA INFILE. Điều này thường nhanh hơn 20 lần so với sử dụng các câu lệnh INSERT.

Tối ưu hóa Báo cáo INSERT

Bạn có thể tìm thấy nhiều mẹo hơn về cách tăng tốc các câu lệnh chèn vào liên kết ở trên.


3
Những gì về hồ sơ trùng lặp?
Matteo

2
@Matteo Các bản sao sẽ được cơ sở dữ liệu chèn hoặc từ chối dựa trên lược đồ bạn đã xác định.
ankush981

Sử dụng đa phương tiện mysql
Francisco Yepes Barrera

1
Liên kết thứ hai 404.
dimir

1
Liên kết bị hỏng "Tốc độ chèn câu lệnh" hiện được trình bày trong: Tối ưu hóa Báo cáo INSERT .
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
Điều này xứng đáng được nâng cấp hơn, bằng cách này, bạn có thể chèn dữ liệu hàng loạt được lấy từ các bảng khác
Novastorm

4
Nếu chỉ có một lời giải thích về những gì đang xảy ra trong đoạn mã này, thì tôi phải "lấy dữ liệu chèn số lượng lớn từ các bảng khác" ...
Aleister Tanek Javas Mraz

0

Đây là một giải pháp PHP đã sẵn sàng để sử dụng với bảng: m (mối quan hệ nhiều-nhiều):

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

Việc sử dụng implode () sẽ tránh được vấn đề "ký tự cuối cùng" nhưng nó tạo ra một bộ nhớ khổng lồ. Cô ấy yêu cầu 3000 hàng, hãy tưởng tượng mỗi hàng có 1kb dữ liệu, đó là 3MB dữ liệu thô. Mảng sẽ chiếm 30 MB bộ nhớ mà cô ấy đã tiêu thụ thêm 30 MB từ bảng $_1 để tập lệnh sẽ sử dụng 60 MB. Chỉ cần nói, nếu không, đó là một giải pháp tốt
John

nó rất hữu ích cho tình huống của tôi
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')";

Ngoài sự khó hiểu của phản hồi này, bạn cũng có thể dễ bị tấn công SQL, giả sử bạn đang sử dụng PHP.
ultrafez

2
1. Có lỗi trong mã SQL của bạn. 2. Giá trị $ sql tiếp theo sẽ thay thế giá trị $ sql trước đó.
Marwan Salim
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.