ใช้ INSERT INTO ... SELECT ... เพื่อคัดลอกข้อมูลจากตารางต้นทางไปตารางปลายทางใน Database เดียวกันได้ในคำสั่งเดียว
ตัวอย่างการใช้งาน
1. สร้างตารางต้นทาง (DemoTable1)
mysql> CREATE TABLE DemoTable1 (
Id INT,
FirstName VARCHAR(20),
Age INT
);
Query OK, 0 rows affected (0.00 sec)
2. เพิ่มข้อมูลต้นทาง
mysql> INSERT INTO DemoTable1 VALUES(101, 'Chris', 24); mysql> INSERT INTO DemoTable1 VALUES(102, 'David', 28);
3. แสดงข้อมูลต้นทาง
mysql> SELECT * FROM DemoTable1; +------+-----------+------+ | Id | FirstName | Age | +------+-----------+------+ | 101 | Chris | 24 | | 102 | David | 28 | +------+-----------+------+
4. สร้างตารางปลายทาง (DemoTable2) โครงสร้างต่างกันเล็กน้อย
mysql> CREATE TABLE DemoTable2 (
EmployeeId INT,
EmployeeName VARCHAR(20),
EmployeeAge INT
);
Query OK, 0 rows affected (0.00 sec)
5. INSERT SELECT: คัดลอกเฉพาะ Id=102
mysql> INSERT INTO DemoTable2(EmployeeId, EmployeeName, EmployeeAge)
SELECT Id, FirstName, Age FROM DemoTable1 WHERE Id = 102;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
6. ตรวจสอบตารางปลายทาง
mysql> SELECT * FROM DemoTable2; +------------+--------------+-------------+ | EmployeeId | EmployeeName | EmployeeAge | +------------+--------------+-------------+ | 102 | David | 28 | +------------+--------------+-------------+
รูปแบบคำสั่ง
INSERT INTO target_table (col1, col2, col3) SELECT source_col1, source_col2, source_col3 FROM source_table WHERE condition;
ข้อดีของ INSERT SELECT
- ⚡ Atomic: ทำใน 1 Statement ไม่ต้อง Fetch แล้ว Insert ทีละแถวใน Application
- 🔒 Consistent: ข้อมูลไม่เปลี่ยนระหว่าง Select และ Insert
- 🚀 Fast: ประมวลผลฝั่ง Server ไม่มี Network Round-trip
- 🔧 Flexible: ใช้ WHERE, JOIN, Function, Expression ได้หมด
กรณีคอลัมน์ตรงกันทุกคอลัมน์ (ลำดับและจำนวนเท่ากัน)
INSERT INTO target_table SELECT * FROM source_table WHERE ...;
สรุป
INSERT INTO target (cols) SELECT cols FROM source WHERE ... เป็นวิธีมาตรฐานและมีประสิทธิภาพสูงสุดสำหรับการ Copy ข้อมูลระหว่างตารางใน MySQL เดียวกัน