การแทรกหลายแถวใน mysql


349

แบบสอบถามฐานข้อมูลเร็วขึ้นหรือไม่ถ้าฉันแทรกหลายแถวพร้อมกัน:

ชอบ

INSERT....

UNION

INSERT....

UNION

(ฉันต้องการแทรกแถว 2-3000 แถว)


8
ยูเนี่ยนสำหรับการเลือก
Jacob

1
เป็นอย่างไรบ้างแถวมา? คุณเขียน SQL โดยตรงบน MySQL Query Browser หรือใช้จากภายใน PHP หรือ C # หรืออย่างอื่น หากคุณเหมาะสมในกรณีหลังให้ตรวจสอบลิงก์ต่อไปนี้: วิธีที่เร็วที่สุดในการแทรก
เม็ดมีด

คำตอบ:


1176

INSERTคำสั่งที่ใช้VALUESไวยากรณ์สามารถแทรกหลายแถว ในการทำเช่นนี้ให้รวมรายการคอลัมน์หลายค่าโดยแต่ละรายการจะอยู่ในวงเล็บและคั่นด้วยเครื่องหมายจุลภาค

ตัวอย่าง:

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

แหล่ง


@RPK ฉันเห็นด้วยกับคุณ แต่ฉันไม่รู้จักแหล่งข้อมูลของเธอ อย่างที่ฉันได้เขียนไปแล้วถ้าเธอมีไฟล์ฉันจะใช้ไวยากรณ์โหลดข้อมูลตามที่ cularis แนะนำ :)
Nicola Cossu

INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3ก็ยังเป็นไปได้ที่จะใช้ แน่นอนนี้จะดีกว่าของค่าที่แทรกมาจากตารางที่แตกต่างกัน
Zohar Peled

72
การอ้างอิงที่มีประโยชน์เพราะบางครั้งฉันก็ลืมไวยากรณ์ง่ายๆ
Captain Hypertext

a, b และ c ที่นี่คือตัวแปรชั่วคราวที่จัดเก็บเนื้อหาของแถวหรือไม่
Lealo

3
@ ถูกต้องไม่พวกเขาเป็นชื่อคอลัมน์ตารางที่จะแทรกค่าในลำดับเดียวกัน
BeetleJuice

60

หากคุณมีข้อมูลของคุณในแฟ้มข้อความคุณสามารถใช้โหลดข้อมูล INFILE

เมื่อโหลดตารางจากไฟล์ข้อความให้ใช้โหลดข้อมูล INFILE โดยทั่วไปแล้วจะเร็วกว่าการใช้คำสั่ง INSERT 20 เท่า

การปรับงบ INSERT ให้เหมาะสม

คุณสามารถหาเคล็ดลับเพิ่มเติมเกี่ยวกับวิธีเพิ่มความเร็วในการแทรกคำสั่งของคุณได้ที่ลิงค์ด้านบน


3
สิ่งที่เกี่ยวกับบันทึกซ้ำ
Matteo

2
@Matteo รายการซ้ำจะถูกแทรกหรือปฏิเสธโดยฐานข้อมูลตามสคีมาที่คุณกำหนดไว้
ankush981

ใช้ mysql multiqueries
Francisco Yepes Barrera

1
ลิงค์ที่สอง
404.

1
การเชื่อมโยงเสีย "ความเร็วของงบแทรก" ได้รับการคุ้มครองในขณะนี้: งบเพิ่มประสิทธิภาพ 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
สิ่งนี้สมควรได้รับการ
อัปโหลด

4
ถ้าเพียง แต่มีคำอธิบายว่าเกิดอะไรขึ้นในส่วนของรหัสนี้เนื่องจากฉันต้อง "แทรกข้อมูลจำนวนมากที่ดึงมาจากตารางอื่น ๆ " ...
Aleister

0

นี่คือโซลูชัน PHP ที่พร้อมใช้งานกับตาราง: m (สัมพันธ์หลายต่อหลายกลุ่ม):

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

การใช้ implode () จะหลีกเลี่ยงปัญหา "ตัวอักษรตัวสุดท้าย" แต่มันจะสร้างหน่วยความจำขนาดใหญ่เหนือหัว เธอขอแถว 3000 จินตนาการว่าแต่ละแถวมีข้อมูล 1kb นั่นคือข้อมูลดิบ 3MB แล้ว อาร์เรย์จะใช้หน่วยความจำ 30MB ซึ่งเธอใช้ไปแล้วอีก 30MB จาก $ table_1 ดังนั้นสคริปต์จะใช้ 60MB เพียงแค่พูดมิฉะนั้นมันจะเป็นทางออกที่ดี
จอห์น

มันมีประโยชน์สำหรับสถานการณ์ของฉัน
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')";

นอกเหนือจากความสับสนของการตอบสนองนี้คุณอาจเสี่ยงต่อการฉีด SQL โดยสมมติว่าคุณใช้ PHP
ultrafez

2
1. มีข้อผิดพลาดในรหัส SQL ของคุณ 2. ค่า $ sql ถัดไปจะแทนที่ค่า $ sql ก่อนหน้า
Marwan Salim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.