Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีดึงค่า ID สูงสุดจากตารางแรก แล้ว INSERT ลงตารางที่สองทุกแถวด้วย INSERT ... SELECT

การ 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 ซ้ำได้หลายที่