MySQL การใช้งานคำสั่ง INSERT INTO SELECT

INSERT INTO ... SELECT เป็นคำสั่งที่ใช้สำหรับคัดลอกข้อมูลจากตารางหนึ่งไปอีกตารางหนึ่ง โดยใช้คำสั่ง SELECT เป็นแหล่งข้อมูลต้นทาง (Source) ไม่ต้องเขียนค่า VALUES แบบระบุทีละแถว เหมาะสำหรับการคัดลอกข้อมูลจำนวนมากจากตารางหนึ่งไปยังอีกตารางที่มีโครงสร้างคล้ายกัน

รูปแบบคำสั่ง

INSERT INTO target_table (column1, column2, ...)
SELECT column1, column2, ...
FROM source_table
WHERE condition;

ตัวอย่างการใช้งาน

สมมุติว่ามีตารางสำรองชื่อ backup_customer (สร้างขึ้นมาใหม่ด้วยคำสั่งด้านล่าง)

SQL
CREATE TABLE backup_customer AS
SELECT * FROM customer WHERE 1 = 0;
  • สร้างตารางใหม่ที่มีโครงสร้างเหมือนตาราง customer

ต้องการคัดลอกลูกค้าจากตาราง customer ที่มี store_id = 1 ไปยังตาราง backup_customer

SQL
INSERT INTO backup_customer (customer_id, store_id, first_name, last_name, email, address_id, active, create_date, last_update)
SELECT customer_id, store_id, first_name, last_name, email, address_id, active, create_date, last_update
FROM customer
WHERE store_id = 1;
  • INSERT INTO backup_customer (...) ระบุคอลัมน์เป้าหมายที่ต้องการบันทึก
  • SELECT ... FROM customer WHERE store_id = 1 ดึงข้อมูลลูกค้าทั้งหมดจากตาราง customer ที่มีรหัสร้าน (store_id) เท่ากับ 1
  • ผลลัพธ์ที่ได้จาก SELECT จะถูกนำไป INSERT ลงในตาราง backup_customer

ข้อควรระวัง

  • คอลัมน์ที่เลือกใน SELECT ต้องตรงกับลำดับและประเภทข้อมูลของคอลัมน์ใน INSERT INTO
  • หากมี Primary Key / Constraint ที่อาจชนกัน เช่น customer_id ซ้ำ ต้องจัดการล่วงหน้า เช่น
    • ใช้ AUTO_INCREMENT
    • ไม่ระบุ Primary Key แล้วให้ระบบกำหนดเอง

หรืออาจใช้คำสั่ง DISTINCT เข้ามาช่วยเพื่อเลือกเฉพาะแถวที่ไม่ซ้ำ เช่น

SQL
INSERT INTO backup_customer (customer_id, store_id, first_name, last_name, email, address_id, active, create_date, last_update)
SELECT DISTINCT customer_id, store_id, first_name, last_name, email, address_id, active, create_date, last_update
FROM customer
WHERE store_id = 1;
แชร์เรื่องนี้