SQL 筆記:更新資料 UPDATE SET WHERE

UPDATE & SET 語法

UPDATE $表名稱
SET $欄位1 = $值1, $欄位2 = $值2, ...

但這樣寫會有個問題,一般較少這樣寫...原因是「會更新全部的 row 欄位」

UPDATE SET WHERE 語法

但要注意,一般不會如上述這樣寫,因為缺少了「WHERE」來篩選目標對象,會導致表中的所有 row 紀錄資料都將被更新!

一般還是會加上 WHERE 來指定特定目標更新資料

UPDATE $表名稱
SET $欄位1 = $值1, $欄位2 = $值2, ...
WHERE $目標對象的條件;

範例:更新指定的使用者資料

假設我們有一個 users 資料表:

id name email age
1 Alice alice@mail.com 25
2 Bob bob@example.com 30

現在我們想要把 id = 2 的使用者名稱改成 "Simon",可以這樣寫:

UPDATE users
SET name = 'Simon'
WHERE id = 2;

這樣只會更新 id 為 2 的那一筆資料,其它 row 不受影響。

一次更新多個欄位

如果要同時更新多個欄位,也可以在 SET 中用逗號分隔多個欄位與對應值:

UPDATE users
SET name = 'Allen', age = 28
WHERE id = 1;

小心條件寫得不夠精確

有時候你可能會這樣寫:

UPDATE users
SET age = 20
WHERE name = 'Bob';

如果資料表中剛好有兩個以上名字叫 Bob 的使用者,就會同時更新多筆資料。因此,當欄位不是唯一值時,盡量避免只用非唯一欄位當條件,可以搭配 id 或其他唯一標識來縮小目標範圍。

先 SELECT 再 UPDATE

在正式環境中,動手更新資料之前,建議先用 SELECT 模擬一下條件

SELECT * FROM users
WHERE age < 18;

確認結果是你想要修改的對象,再執行:

UPDATE users
SET status = 'underage'
WHERE age < 18;

這樣可以降低誤刪誤改的風險。

條件式更新 CASE WHEN

有時候會遇到更細緻的需求,例如根據不同條件給不同的值,就可以搭配 CASE WHEN

UPDATE users
SET status = 
  CASE 
    WHEN age >= 18 THEN 'adult'
    WHEN age < 18 THEN 'minor'
  END;

這樣就能在一個 UPDATE 裡,依據不同條件給不同的欄位值,非常實用XD