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;