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, ไม่แนะนำใหม่ |