MySQL การสร้าง Temporary Table ใน Stored Procedure

เมื่อต้องการเก็บข้อมูลชั่วคราวระหว่างการทำงานของ Stored Procedure โดยไม่ต้องบันทึกลงในตารางจริง Temporary Table (ตารางชั่วคราว) คือเครื่องมือที่ตอบโจทย์ที่สุด เหมาะกับการประมวลผลข้อมูลแบบหลายขั้นตอน เช่นการจัดกลุ่ม, การกรอง, หรือการคำนวณก่อนส่งผลลัพธ์กลับ

Temporary Table คืออะไร?

Temporary Table หรือ “ตารางชั่วคราว” คือ ตารางที่ถูกสร้างขึ้นเฉพาะใน session ปัจจุบัน และจะถูกลบอัตโนมัติเมื่อจบการเชื่อมต่อ (session)

ประโยชน์ของ Temporary Table

  • เก็บข้อมูลชั่วคราวระหว่างคำนวณ
  • ลดความซับซ้อนของ SQL Query หลัก
  • เพิ่มประสิทธิภาพระบบ โดยลดการ join/query ซ้ำ
  • ข้อมูลไม่ถาวร ปลอดภัย ลบทิ้งอัตโนมัติ
  • เหมาะกับ Stored Procedure, Cursor, และ Loop
  • ใช้งานสะดวกในระบบวิเคราะห์และ ETL
  • ไม่กระทบข้อมูลจริง เหมาะกับงานทดสอบ

วิธีสร้าง Temporary Table ใน Stored Procedure

เราสามารถใช้คำสั่ง CREATE TEMPORARY TABLE ได้ทันทีภายใน Stored Procedure

รูปแบบคำสั่ง

CREATE TEMPORARY TABLE temp_table_name (
    column1 datatype,
    column2 datatype,
    ...
);

ตัวอย่าง: สร้าง Temporary Table เพื่อเก็บยอดขายรายวัน

สมมุติว่าเราต้องการดึงยอดขายของแต่ละวัน จากนั้นนำไปประมวลผลต่อ เช่น สรุปวันขายสูงสุด หรือเก็บไว้ก่อนส่งกลับ

โครงสร้างตาราง sales

sale_idsale_dateamount
12024-04-10100.00
22024-04-10250.00
32024-04-1180.00

Stored Procedure

SQL
DELIMITER //

CREATE PROCEDURE analyze_daily_sales()
BEGIN
  -- สร้างตารางชั่วคราวเพื่อเก็บยอดขายรวมต่อวัน
  CREATE TEMPORARY TABLE IF NOT EXISTS temp_daily_sales (
    sale_date DATE,
    total_amount DECIMAL(10,2)
  );

  -- เติมข้อมูลยอดขายรวมลงตารางชั่วคราว
  INSERT INTO temp_daily_sales (sale_date, total_amount)
  SELECT sale_date, SUM(amount)
  FROM sales
  GROUP BY sale_date;

  -- แสดงผลจากตารางชั่วคราว
  SELECT * FROM temp_daily_sales;

  -- ตารางนี้จะถูกลบอัตโนมัติเมื่อ session จบ
END //

DELIMITER ;
  • CREATE TEMPORARY TABLE สร้างตารางชั่วคราวที่มีอายุอยู่แค่ใน session นี้
  • IF NOT EXISTS ป้องกัน error หากมี temp table ชื่อเดียวกันอยู่ก่อนแล้ว
  • sale_date, total_amount คอลัมน์ที่เราจะเก็บข้อมูลจากการสรุปยอด
  • INSERT INTO ... SELECT สรุปยอดขายจากตาราง sales แล้วเก็บลง temp table
  • SELECT * แสดงผลเพื่อดูว่าข้อมูลใน temp table ถูกต้องหรือไม่

ผลลัพธ์

sale_datetotal_amount
2024-04-10350.00
2024-04-1180.00

ข้อควรระวังในการใช้ Temporary Table

  • Temporary Table จะอยู่แค่ใน session เดียวกันเท่านั้น
  • ไม่สามารถใช้ร่วมกันระหว่างผู้ใช้หรือ Connection ได้
  • ถ้าจะสร้างชื่อเดียวกันหลายครั้ง ควรใช้ DROP TEMPORARY TABLE IF EXISTS ก่อน หรือใช้ IF NOT EXISTS
แชร์เรื่องนี้