這篇來講如何「刪除資料」。
刪除資料用的是 DELETE 這個指令。
在所有資料操作中,刪除是最需要謹慎的。
因為刪除在資料庫中是真的消失,沒有資源回收桶可以讓你復原。
這篇文章會帶你了解 DELETE 的用法,以及刪除資料時必須注意的事項。
DELETE 的核心問題:刪哪些資料
想像一個情境:老闆跟你說「幫我刪除會員資料」。
你的直覺反應應該是:
第一,要刪哪些會員?
你應該不會想把全部會員都刪掉吧?那真的太刺激了。
所以你要確認:是要刪除哪些特定的會員?
第二,你真的要刪嗎?
資料收集不容易。
這些會員搞不好是花錢投廣告才吸引進來註冊的。
你真的要刪嗎?真的真的要刪嗎?
這不是開玩笑,很多資安嚴謹的公司,要刪資料時會要求你填特別的表單,記錄是誰刪的、刪了什麼,之後要負責。
刪資料這件事很嚴重,一定要謹慎。
在 SQL 中,刪除資料用 DELETE,指定要刪哪些資料用 WHERE。
完整的刪除語法長這樣:
DELETE FROM 表單名稱
WHERE 篩選條件DELETE FROM:表示要從某張表單刪除資料表單名稱:指定要刪除哪張表單的資料WHERE 篩選條件:指定要刪除哪些資料列
DELETE 一定要加 WHERE 條件
這裡要特別強調:99% 的情況下,DELETE 一定要加 WHERE 篩選條件。
為什麼?
還記得 SELECT 讀取資料時,不加 WHERE 會怎樣嗎?會把全部資料都讀出來。
同樣的道理:
- 讀取資料不加 WHERE → 全部都讀出來
- 更新資料不加 WHERE → 全部都更新
- 刪除資料不加 WHERE → 全部都刪掉
全部都刪掉,就是整張表單的資料清空。
這種事情通常不會發生,如果真的遇到這個需求,請先問一下前輩,確認這是不是你真正想做的事。
刪除前先用 SELECT 確認
在真正執行 DELETE 之前,建議你做這幾件事:
第一,先用 SELECT 確認
把 DELETE 改成 SELECT,用同樣的 WHERE 條件,先把資料讀出來看一下。
確認這些資料列是不是你真正要刪的目標。
-- 先用 SELECT 確認
SELECT *
FROM 會員
WHERE 姓 = '王'
-- 確認沒問題後,再改成 DELETE
DELETE FROM 會員
WHERE 姓 = '王'第二,做個簡單備份
如果你更謹慎一點,可以把這些資料先存到某個地方。
怎麼做?
最簡單的方式是先用 SELECT 把資料讀出來,然後複製到 Excel 或文字檔存起來。
或者,你可以用 INSERT 把這些資料複製到另一張備份表單。
-- 先建立一張備份表單,結構跟原本的一樣
-- 然後把要刪的資料複製過去
INSERT INTO 會員_備份
SELECT *
FROM 會員
WHERE 姓 = '陳' AND 名 = '大同'這樣萬一之後需要回溯,至少你知道刪了哪些資料,可以把它們填回去。
雖然這不是最完美的備份方式,但至少在緊急情況下有個保險。
刪除特定資料
假設我們有一張「會員」表單:
| ID | 姓 | 名 |
|---|---|---|
| 1 | 王 | 小明 |
| 2 | 李 | 小華 |
| 3 | 陳 | 大同 |
現在要刪除姓「陳」且名為「大同」的會員。
先用 SELECT 確認:
SELECT *
FROM 會員
WHERE 姓 = '陳' AND 名 = '大同'確認結果:
| ID | 姓 | 名 |
|---|---|---|
| 3 | 陳 | 大同 |
確認這就是要刪的資料後,再執行 DELETE:
DELETE FROM 會員
WHERE 姓 = '陳' AND 名 = '大同'執行後,表單變成:
| ID | 姓 | 名 |
|---|---|---|
| 1 | 王 | 小明 |
| 2 | 李 | 小華 |
軟刪除(Soft Delete)
既然刪除這麼危險,有沒有辦法不真的刪資料呢?
有的,這個做法叫做「軟刪除」(Soft Delete)。
做法是這樣:在表單中多加一個欄位,例如叫 is_deleted。
當你要「刪除」某筆資料時,不是真的刪掉它,而是把 is_deleted 設成 true。
| ID | 姓 | 名 | is_deleted |
|---|---|---|---|
| 1 | 王 | 小明 | false |
| 2 | 李 | 小華 | false |
| 3 | 陳 | 大同 | true |
這樣資料還在資料庫裡,只是被標記成「已刪除」。
之後在讀取資料時,只要加上 WHERE is_deleted = false,就不會讀到這些被標記的資料。
SELECT *
FROM 會員
WHERE is_deleted = false這樣看起來就像是資料被刪掉了,但其實還在。
軟刪除在業界非常常用。
所以當老闆叫你刪資料時,要先想一下:他是真的希望資料消失,還是只是不希望在某些地方顯示出來?
如果是後者,用軟刪除就可以了。
SQL 字串用單引號
順便提一下,在 SQL 中寫字串時,要用單引號 ',不是雙引號 "。
-- 正確:用單引號
WHERE 姓 = '王'
-- 避免:用雙引號(在某些資料庫中,雙引號是用來指定欄位名稱的)
WHERE 姓 = "王"雖然有些資料庫兩種都能用,但為了避免混淆,養成好習慣:SQL 中的字串一律用單引號。
小結
這篇文章介紹了 DELETE 的用法和注意事項:
DELETE FROM 表單名稱 WHERE 篩選條件:刪除符合條件的資料列- 篩選條件超級重要:不加 WHERE 會刪掉全部資料
- 刪除前先用 SELECT 確認:確保要刪的是正確的資料
- 刪除是不可逆的:沒有資源回收桶,刪了就是真的消失
- 軟刪除:用
is_deleted欄位標記,而不是真的刪除資料 - SQL 字串用單引號:養成好習慣,避免混淆
刪除資料很簡單,但也要很謹慎。
下指令前多想一下,確認清楚再執行。