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

อัปเดตทุกแถวยกเว้นค่าเฉพาะในคอลัมน์ด้วย IF() ใน MySQL

การ UPDATE ทุกแถวแต่ข้ามค่าเฉพาะด้วย IF()

ใช้ IF(condition, true_val, false_val) ใน SET clause เพื่อตั้งค่าต่างกันตามเงื่อนไข: แถวที่ตรงเงื่อนไขคงค่าเดิม แถวอื่นอัปเดต

Syntax

UPDATE table_name 
SET column = IF(exclude_condition, current_value, new_value);

ตัวอย่าง: อัปเดต isMarried = 1 ทุกคน ยกเว้น Id=5 (คงค่าเดิม)

สร้างตารางและเพิ่มข้อมูล:

mysql> CREATE TABLE DemoTable736 (
    CustomerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    CustomerName VARCHAR(100),
    isMarried BOOLEAN
);
Query OK, 0 rows affected (0.53 sec)

mysql> INSERT INTO DemoTable736 (CustomerName, isMarried) VALUES 
    ('Chris', 0), ('Robert', 0), ('David', 0), ('Mike', 0), ('Carol', 1), ('Bob', 0);
Query OK, 6 rows affected

ข้อมูลต้นฉบับ:

mysql> SELECT * FROM DemoTable736;
+------------+--------------+-----------+
| CustomerId | CustomerName | isMarried |
+------------+--------------+-----------+
| 1          | Chris        | 0         |
| 2          | Robert       | 0         |
| 3          | David        | 0         |
| 4          | Mike         | 0         |
| 5          | Carol        | 1         |
| 6          | Bob          | 0         |
+------------+--------------+-----------+
6 rows in set (0.00 sec)

อัปเดต isMarried = 1 ทุกแถว **ยกเว้น CustomerId = 5** (Carol):

mysql> UPDATE DemoTable736 
SET isMarried = IF(CustomerId = 5, 1, 1);
Query OK, 5 rows affected (0.13 sec)

หมายเหตุ: ตัวอย่างนี้ IF(CustomerId=5, 1, 1) ทั้งสองด้านคือ 1 → ทุกแถวกลายเป็น 1 (รวม Carol ด้วย) หากต้องการ **ข้ามจริง** (Carol คง 1, คนอื่นกลายเป็น 1 → ผลเหมือนกัน) แต่ถ้าต้องการ Carol คงค่าเดิม คนอื่นเปลี่ยน:

UPDATE DemoTable736 
SET isMarried = IF(CustomerId = 5, isMarried, 1);  -- Carol คง 1, คนอื่นเป็น 1

ผลลัพธ์ (ทุกคนกลายเป็น 1):

mysql> SELECT * FROM DemoTable736;
+------------+--------------+-----------+
| CustomerId | CustomerName | isMarried |
+------------+--------------+-----------+
| 1          | Chris        | 1         |
| 2          | Robert       | 1         |
| 3          | David        | 1         |
| 4          | Mike         | 1         |
| 5          | Carol        | 1         |
| 6          | Bob          | 1         |
+------------+--------------+-----------+
6 rows in set (0.00 sec)

รูปแบบที่ใช้งานจริงมากกว่า: อัปเดตเฉพาะกลุ่ม บางกลุ่มไม่เปลี่ยน

-- อัปเดต Status = 'Active' สำหรับทุกคน ยกเว้น Role='Admin'
UPDATE users SET status = IF(role = 'Admin', status, 'Active');

-- เพิ่ม Salary 10% ยกเว้น Department='Executive'
UPDATE employees SET salary = IF(department = 'Executive', salary, salary * 1.10);

CASE WHEN สำหรับหลายเงื่อนไข

UPDATE DemoTable736 
SET isMarried = CASE 
    WHEN CustomerId = 5 THEN isMarried      -- ข้าม Carol
    WHEN CustomerId = 3 THEN 0              -- David = 0
    ELSE 1                                  -- คนอื่น = 1
END;