การ "Toggle" หรือสลับค่าระหว่าง 0 และ 1 ในคอลัมน์ Integer สามารถทำได้ในคำสั่ง UPDATE เดียวด้วยฟังก์ชัน IF()
รูปแบบคำสั่ง
UPDATE yourTableName
SET yourColumnName = IF(yourColumnName = 0, 1, 0);
ตัวอย่างการใช้งาน
1. สร้างตารางและเพิ่มข้อมูลสลับ 0, 1
mysql> CREATE TABLE ToggleDemo (IsOnOrOff INT);
Query OK, 0 rows affected (0.53 sec)
mysql> INSERT INTO ToggleDemo VALUES (1), (0), (1), (0), (1), (0);
2. ดูข้อมูลก่อน Toggle
mysql> SELECT * FROM ToggleDemo;
+-----------+
| IsOnOrOff |
+-----------+
| 1 |
| 0 |
| 1 |
| 0 |
| 1 |
| 0 |
+-----------+
6 rows in set (0.00 sec)
3. สั่ง Toggle ทั้งตาราง
mysql> UPDATE ToggleDemo SET IsOnOrOff = IF(IsOnOrOff = 0, 1, 0);
Query OK, 6 rows affected (0.12 sec)
4. ตรวจสอบหลัง Toggle
mysql> SELECT * FROM ToggleDemo;
+-----------+
| IsOnOrOff |
+-----------+
| 0 |
| 1 |
| 0 |
| 1 |
| 0 |
| 1 |
+-----------+
6 rows in set (0.00 sec)
วิธีอื่นๆ
ใช้ CASE WHEN (มาตรฐาน ANSI SQL)
UPDATE ToggleDemo
SET IsOnOrOff = CASE WHEN IsOnOrOff = 0 THEN 1 ELSE 0 END;
ใช้คณิตศาสตร์ (สำหรับ 0/1 เท่านั้น)
UPDATE ToggleDemo SET IsOnOrOff = 1 - IsOnOrOff;
0 → 1, 1 → 0 (เร็วที่สุดและสั้นที่สุด)
ใช้ XOR (Bitwise)
UPDATE ToggleDemo SET IsOnOrOff = IsOnOrOff ^ 1;
กรณีคอลัมน์ BOOLEAN / TINYINT(1)
MySQL ไม่มีชนิด Boolean จริง ใช้ TINYINT(1) แทน ค่าจริงคือ 0 และ 1
UPDATE flags SET is_active = NOT is_active; -- MySQL รองรับ NOT สำหรับตัวเลข
Toggle เฉพาะเงื่อนไข (WHERE)
UPDATE users
SET is_online = IF(is_online = 0, 1, 0)
WHERE last_login > DATE_SUB(NOW(), INTERVAL 1 HOUR);
ประสิทธิภาพ
- คำสั่ง UPDATE เดียวนี้ใช้ Index ได้ (ถ้ามี Index บนคอลัมน์ที่ UPDATE)
- แถวที่เปลี่ยนค่าจะถูก Lock จน Transaction จบ
- สำหรับตารางใหญ่ ควรแบ่ง Batch (LIMIT ใน Subquery) เพื่อลด Lock Contention