ภาพรวม
สามารถคัดลอกข้อมูลจากคอลัมน์ของตารางหนึ่งไปยังตารางอีกตารางได้ในคำสั่งเดียว โดยใช้ INSERT ... SELECT ไม่ต้องดึงข้อมูลออกมาก่อนแล้วค่อย Insert ใหม่
ไวยากรณ์
INSERT INTO target_table (target_column)
SELECT source_column
FROM source_table
[WHERE condition];
ตัวอย่างสมบูรณ์
1. สร้างตารางต้นทางและเพิ่มข้อมูล
CREATE TABLE DemoTable1 (
Name VARCHAR(100),
Gender ENUM('MALE', 'FEMALE')
);
INSERT INTO DemoTable1 VALUES ('Chris', 'Male');
INSERT INTO DemoTable1 VALUES ('Emma', 'Female');
2. สร้างตารางปลายทาง
CREATE TABLE DemoTable2 (
EmployeeGender VARCHAR(100)
);
3. คัดลอกข้อมูลด้วยคำสั่งเดียว
INSERT INTO DemoTable2 (EmployeeGender)
SELECT Gender FROM DemoTable1;
4. ผลลัพธ์
SELECT * FROM DemoTable2;
+----------------+
| EmployeeGender |
+----------------+
| MALE |
| FEMALE |
+----------------+
การประยุกต์ใช้เพิ่มเติม
คัดลอกหลายคอลัมน์พร้อมกัน
INSERT INTO TargetTable (col1, col2, col3)
SELECT colA, colB, colC
FROM SourceTable;
คัดลอกพร้อมเปลี่ยนชื่อคอลัมน์/คำนวณค่า
INSERT INTO TargetTable (full_name, age_group)
SELECT CONCAT(first_name, ' ', last_name),
CASE
WHEN age < 18 THEN 'Minor'
WHEN age < 60 THEN 'Adult'
ELSE 'Senior'
END
FROM SourceTable;
คัดลอกพร้อมเงื่อนไข WHERE
INSERT INTO ActiveUsers (user_id, email)
SELECT id, email
FROM Users
WHERE status = 'active' AND last_login > DATE_SUB(NOW(), INTERVAL 30 DAY);
ข้อดีของ INSERT ... SELECT
- Atomic - ทำงานใน Transaction เดียว
- ประสิทธิภาพสูง - ไม่ต้อง Round-trip ระหว่าง Application และ DB
- รองรับ WHERE, JOIN, FUNCTION - กรอง/แปลงข้อมูลระหว่างทางได้
- หลีกเลี่ยง Race Condition - ข้อมูลไม่เปลี่ยนระหว่าง Select และ Insert
ข้อควรระวัง
- Data Type ของคอลัมน์ต้นทางและปลายทางต้องเข้ากันได้
- ถ้ามี PRIMARY KEY หรือ UNIQUE KEY ในตารางปลายทาง อาจเกิด Duplicate Key Error
- ใช้
INSERT IGNOREหรือON DUPLICATE KEY UPDATEเพื่อจัดการข้อมูลซ้ำ