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

จำลอง Array Variable ใน MySQL ด้วย Temporary Table

MySQL ไม่มี Array Variable แบบภาษาโปรแกรม แต่สามารถ **จำลอง** ได้ด้วย Temporary Table ซึ่งเก็บชุดข้อมูลชั่วคราวใน Session นั้นๆ

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

CREATE TEMPORARY TABLE IF NOT EXISTS temp_table_name 
SELECT column1, column2, ... FROM source_table WHERE condition;

ตัวอย่างการใช้งาน

1. สร้างตารางต้นฉบับ

mysql> CREATE TABLE SimulateArrayDemo (
    -> Id INT,
    -> FirstName VARCHAR(100),
    -> LastName VARCHAR(100)
    -> );
Query OK, 0 rows affected (1.25 sec)

mysql> INSERT INTO SimulateArrayDemo VALUES 
    -> (1, 'Sam', 'Taylor'), (2, 'Carol', 'Taylor'), (3, 'Bob', 'Smith'),
    -> (4, 'David', 'Taylor'), (5, 'John', 'Smith'), (6, 'Mike', 'Taylor');

2. ดูข้อมูลทั้งหมด

mysql> SELECT * FROM SimulateArrayDemo;
+------+-----------+----------+
| Id   | FirstName | LastName |
+------+-----------+----------+
| 1    | Sam       | Taylor   |
| 2    | Carol     | Taylor   |
| 3    | Bob       | Smith    |
| 4    | David     | Taylor   |
| 5    | John      | Smith    |
| 6    | Mike      | Taylor   |
+------+-----------+----------+
6 rows in set (0.00 sec)

3. สร้าง Temporary Table (จำลอง Array) - เฉพาะนามสกุล Taylor

mysql> CREATE TEMPORARY TABLE IF NOT EXISTS SimulationOfArray 
    -> SELECT Id, FirstName FROM SimulateArrayDemo WHERE LastName = 'Taylor';
Query OK, 4 rows affected (0.10 sec)

4. ใช้งาน Temporary Table

mysql> SELECT * FROM SimulationOfArray;
+------+-----------+
| Id   | FirstName |
+------+-----------+
| 1    | Sam       |
| 2    | Carol     |
| 4    | David     |
| 6    | Mike      |
+------+-----------+
4 rows in set (0.00 sec)

คุณสมบัติ Temporary Table

  • Scope: เห็นได้เฉพาะ Session ที่สร้าง (Connection อื่นไม่เห็น)
  • อายุ: หายอัตโนมัติเมื่อ Disconnect หรือจบ Session
  • ชื่อ: สามารถซ้ำกับตารางปกติได้ (Temp จะมี Priority สูงกว่า)
  • Index: สร้าง Index ได้เหมือนตารางปกติ
  • Transaction: รองรับ Transaction (Commit/Rollback)

กรณีใช้งานจริง

1. เก็บรายการ ID สำหรับ Query ต่อเนื่อง

CREATE TEMPORARY TABLE temp_ids (id INT PRIMARY KEY);
INSERT INTO temp_ids SELECT id FROM orders WHERE status = 'pending';

-- ใช้ใน Query ถัดๆ ไป
SELECT * FROM order_items WHERE order_id IN (SELECT id FROM temp_ids);
UPDATE orders SET status = 'processing' WHERE id IN (SELECT id FROM temp_ids);

2. แทน IN List ยาวๆ

-- แทน WHERE id IN (1,2,3,...10000)
CREATE TEMPORARY TABLE temp_ids (id INT PRIMARY KEY);
INSERT INTO temp_ids VALUES (1),(2),(3)...;
SELECT * FROM big_table WHERE id IN (SELECT id FROM temp_ids);

3. Intermediate Results ใน Stored Procedure

CREATE PROCEDURE ComplexReport()
BEGIN
    CREATE TEMPORARY TABLE temp_stage1 AS SELECT ...;
    CREATE TEMPORARY TABLE temp_stage2 AS SELECT ... FROM temp_stage1 ...;
    SELECT * FROM temp_stage2;
    DROP TEMPORARY TABLE temp_stage1, temp_stage2;
END

ตัวเลือกอื่น: JSON Array (MySQL 5.7+)

SET @my_array = JSON_ARRAY(1, 2, 3, 4, 5);
SELECT JSON_EXTRACT(@my_array, '$[0]');  -- 1
SELECT JSON_LENGTH(@my_array);           -- 5
SELECT * FROM JSON_TABLE(@my_array, '$[*]' COLUMNS (val INT PATH '$')) AS jt;

สรุป

วิธีเหมาะสำหรับข้อจำกัด
Temporary Tableชุดข้อมูลใหญ่, ใช้ซ้ำหลาย Query, ต้องการ Indexต้อง CREATE/DROP, ใช้ Disk Space
JSON Arrayชุดข้อมูลเล็ก, ค่า Scalar, ใช้ใน Session เดียวไม่มี Index, Query ซับซ้อนกว่า
CSV String + FIND_IN_SETรูปแบบเก่า, Relative compatibilityช้า, ไม่ Scale, ไม่แนะนำใหม่