เทคนิคการสลับค่า (Swap Values)
ใน MySQL สลับค่าระหว่าง 2 คอลัมน์ในแถวเดียวได้โดยใช้ User-Defined Variable (@variable) เป็นตัวเก็บชั่วคราว
ไวยากรณ์
UPDATE table_name
SET
col1 = (@temp := col1),
col1 = col2,
col2 = @temp
WHERE condition;
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Number1 INT,
Number2 INT
);
INSERT INTO DemoTable (Number1, Number2) VALUES (10, 30);
INSERT INTO DemoTable (Number1, Number2) VALUES (60, 50);
INSERT INTO DemoTable (Number1, Number2) VALUES (110, 100);
2. ข้อมูลก่อนสลับ
SELECT * FROM DemoTable;
+----+---------+---------+
| Id | Number1 | Number2 |
+----+---------+---------+
| 1 | 10 | 30 |
| 2 | 60 | 50 |
| 3 | 110 | 100 |
+----+---------+---------+
3. สลับค่า Number1 และ Number2 ที่ Id = 2
UPDATE DemoTable
SET
Number1 = (@temp := Number1),
Number1 = Number2,
Number2 = @temp
WHERE Id = 2;
4. ผลลัพธ์หลังสลับ
SELECT * FROM DemoTable;
+----+---------+---------+
| Id | Number1 | Number2 |
+----+---------+---------+
| 1 | 10 | 30 |
| 2 | 50 | 60 | -- สลับแล้ว
| 3 | 110 | 100 |
+----+---------+---------+
การทำงานแบบขั้นตอน
@temp := Number1- เก็บค่าเดิมของ Number1 (60) ไว้ใน @tempNumber1 = Number2- กำหนด Number1 = ค่า Number2 (50)Number2 = @temp- กำหนด Number2 = ค่าที่เก็บไว้ (60)
การสลับหลายแถวพร้อมกัน
-- สลับทุกแถว
UPDATE DemoTable
SET
Number1 = (@temp := Number1),
Number1 = Number2,
Number2 = @temp;
วิธีอื่น: ใช้ CASE (ไม่ต้อง Variable)
UPDATE DemoTable
SET
Number1 = CASE WHEN Id = 2 THEN Number2 ELSE Number1 END,
Number2 = CASE WHEN Id = 2 THEN Number1 ELSE Number2 END
WHERE Id = 2;
หมายเหตุ: วิธี CASE นี้ทำงานได้เพราะ MySQL ประเมินค่า RHS ทั้งหมดก่อนจึง Assign (Atomic evaluation)
สรุป
- ใช้ User Variable (@temp) สลับค่า 2 คอลัมน์ใน UPDATE ได้
- ลำดับ Assignment สำคัญ: เก็บค่าเก่า → Set ค่าใหม่ → เรียกค่าเก่า
- MySQL ประเมิน RHS ทั้งหมดก่อน Assign จึงสามารถอ้างอิงคอลัมน์เดิมใน SET เดียวกันได้