การ INSERT ข้อมูลจากตารางหนึ่งไปอีกตารางด้วย INSERT ... SELECT (มีเงื่อนไข)
ใช้ INSERT INTO target_table (cols) SELECT cols FROM source_table WHERE condition เพื่อคัดลอกข้อมูลบางส่วนในคำสั่งเดียว
รูปแบบคำสั่ง
INSERT INTO target_table (col1, col2, ...)
SELECT col1, col2, ...
FROM source_table
WHERE condition;
ตัวอย่าง: คัดลอกข้อมูลจาก DemoTable1 ไป DemoTable2 ยกเว้น Id=2
1. สร้างตารางต้นทางและเพิ่มข้อมูล
CREATE TABLE DemoTable1 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(40)
);
INSERT INTO DemoTable1 (Name) VALUES ('Chris'), ('David'), ('Bob');
2. สร้างตารางปลายทาง (โครงสร้างต่างกัน)
CREATE TABLE DemoTable2 (
ClientId INT,
ClientFirstName VARCHAR(20)
);
3. INSERT ... SELECT พร้อมเงื่อนไข WHERE Id != 2
INSERT INTO DemoTable2 (ClientId, ClientFirstName)
SELECT Id, Name FROM DemoTable1 WHERE Id != 2;
ผลลัพธ์การรัน: Query OK, 2 rows affected (0.17 sec) Records: 2 Duplicates: 0 Warnings: 0
4. ตรวจสอบตารางปลายทาง
SELECT * FROM DemoTable2;
ผลลัพธ์:
+----------+-----------------+
| ClientId | ClientFirstName |
+----------+-----------------+
| 1 | Chris |
| 3 | Bob |
+----------+-----------------+
Id=2 (David) ถูกยกเว้น ตามเงื่อนไข WHERE Id != 2
ข้อดีของ INSERT ... SELECT
- Atomic: ทำงานใน Transaction เดียว
- เร็วกว่า: ไม่ต้อง Round-trip ไป Application
- Memory Efficient: ไม่ต้องโหลดข้อมูลไป Client
- สามารถ Transform ข้อมูลได้:
SELECT UPPER(Name), Id*100 ...
การจัดการ Column Mapping
-- ลำดับคอลัมน์ใน SELECT ต้องตรงกับ INSERT
INSERT INTO Target (A, B, C) SELECT X, Y, Z FROM Source;
-- ใช้ Alias เพื่อความชัดเจน
INSERT INTO Target (A, B, C)
SELECT X AS A, Y AS B, Z AS C FROM Source;
กรณีมี AUTO_INCREMENT ใน Target
CREATE TABLE Target (Id INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(50));
INSERT INTO Target (Name) SELECT Name FROM Source; -- ไม่ระบุ Id
ข้อควรระวัง
- Data Type ต้องเข้ากันได้ (Implicit Conversion อาจเกิด Warning)
- NOT NULL Constraint: ต้องให้ค่าทุกแถว
- Unique/Duplicate Key: อาจ Error หากข้อมูลซ้ำ → ใช้
INSERT IGNOREหรือON DUPLICATE KEY UPDATE - Trigger บน Target จะทำงาน
คัดลอกโครงสร้าง + ข้อมูล (Clone Table)
CREATE TABLE NewTable AS SELECT * FROM OldTable WHERE Condition;