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

สลับค่า 0 และ 1 ในคอลัมน์ INT ของ MySQL ด้วย IF()

การ "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