การ INSERT ข้อมูลจากตารางหนึ่งไปอีกตาราง พร้อมใช้ค่า MAX จากตารางแรก
ใช้คำสั่ง INSERT INTO ... SELECT ร่วมกับ Subquery เพื่อดึงค่า MAX(Id) จากตารางแรก มาใส่ในทุกแถวของตารางที่สอง
รูปแบบคำสั่ง
INSERT INTO target_table (col1, col2, ...)
SELECT (SELECT MAX(id_col) FROM source_table), other_col
FROM source_table;
ตัวอย่าง: คัดลอกชื่อจาก DemoTable1 ไป DemoTable2 พร้อมใส่ Max Id
1. สร้างตารางแรกและเพิ่มข้อมูล
CREATE TABLE DemoTable1 (
Id INT,
Name VARCHAR(100)
);
INSERT INTO DemoTable1 VALUES (1001, 'Chris');
INSERT INTO DemoTable1 VALUES (999, 'Robert');
INSERT INTO DemoTable1 VALUES (1003, 'Mike');
INSERT INTO DemoTable1 VALUES (1002, 'Sam');
2. สร้างตารางที่สอง
CREATE TABLE DemoTable2 (
StudentId INT,
StudentFirstName VARCHAR(100)
);
3. INSERT พร้อมดึง MAX(Id) จากตารางแรก
INSERT INTO DemoTable2 (StudentId, StudentFirstName)
SELECT (SELECT MAX(Id) FROM DemoTable1), Name
FROM DemoTable1;
ผลลัพธ์การรัน: Query OK, 4 rows affected (0.20 sec) Records: 4 Duplicates: 0 Warnings: 0
4. ตรวจสอบตารางที่สอง
SELECT * FROM DemoTable2;
ผลลัพธ์:
+-----------+------------------+
| StudentId | StudentFirstName |
+-----------+------------------+
| 1003 | Chris |
| 1003 | Robert |
| 1003 | Mike |
| 1003 | Sam |
+-----------+------------------+
ค่า MAX(Id) จากตารางแรกคือ 1003 ถูกใส่ในทุกแถวของ StudentId
การทำงานของ Subquery ใน SELECT
(SELECT MAX(Id) FROM DemoTable1)ถูกประเมินค่า **ครั้งเดียว** ก่อนเริ่ม INSERT- ค่าที่ได้ (1003) ถูกใช้ซ้ำสำหรับทุกแถวที่ SELECT จาก DemoTable1
- เทียบเท่ากับ:
INSERT ... SELECT 1003, Name FROM DemoTable1
กรณีใช้งานจริง
- สร้าง Audit Log: บันทึก Batch ID (ค่า MAX ของ Batch Table) ลงในทุกแถวของ Detail Table
- ETL: ใส่ Run ID หรือ Timestamp เดียวกันให้ทุกแถวใน Batch
- Data Warehouse: Surrogate Key Generation
ข้อควรระวัง
- Subquery ใน SELECT ต้องคืนค่า **เพียง 1 ค่า (Scalar)** เท่านั้น
- หากตารางต้นทางว่าง MAX() จะคืน NULL → อาจทำให้ INSERT ค่า NULL ได้ (ขึ้นกับ NOT NULL constraint)
- ประสิทธิภาพ: MAX() บน Primary Key ที่มี Index เร็วมาก (O(1))
รูปแบบอื่น: ใช้ Variable
SELECT MAX(Id) INTO @max_id FROM DemoTable1;
INSERT INTO DemoTable2 (StudentId, StudentFirstName)
SELECT @max_id, Name FROM DemoTable1;
วิธีนี้ชัดเจนกว่า และสามารถใช้ @max_id ซ้ำได้หลายที่