前面的文章我們學會了如何設計資料庫表格,把雜亂的資料整理成有結構的欄位和列。
但光是把資料存進去還不夠,我們還需要對資料進行各種操作:新增一筆訂單、查詢會員資料、修改個人資訊、刪除過期紀錄⋯⋯
這些操作看起來五花八門,但其實只有四種類型。這篇文章要介紹的就是資料庫操作的核心觀念——CRUD。
從 ATM 提款看資料操作
讓我們用一個 ATM 提款的例子,來理解資料庫的四種操作。
只儲存餘額的問題
假設你去 ATM 領錢,最直覺的設計是這樣:
- 讀取你的帳戶餘額(例如:100 元)
- 你領了 50 元
- 更新你的帳戶餘額為 50 元
用表格來看,這種設計只會儲存一個「餘額」欄位:
| 帳戶 | 餘額 |
|---|---|
| 小明 | 100 |
領錢後變成:
| 帳戶 | 餘額 |
|---|---|
| 小明 | 50 |
這個做法很直覺,但有一個大問題:沒有留下紀錄。
如果你的帳戶被盜領,你說「我沒有領這筆錢」,但銀行只有餘額資料,沒有操作紀錄,根本死無對證。
儲存操作紀錄的好處
所以實際上,銀行的做法應該是:
- 讀取你的操作紀錄
- 你領了 50 元
- 新增一筆提款紀錄:「小明在 3/15 10:30 提款 50 元」
- 系統根據所有紀錄計算出目前餘額
用表格來看,這種設計會儲存每一筆操作紀錄:
| 帳戶 | 時間 | 動作 | 金額 |
|---|---|---|---|
| 小明 | 3/15 09:00 | 存款 | 100 |
領錢後,新增一筆紀錄:
| 帳戶 | 時間 | 動作 | 金額 |
|---|---|---|---|
| 小明 | 3/15 09:00 | 存款 | 100 |
| 小明 | 3/15 10:30 | 提款 | 50 |
這樣一來,每一筆操作都有紀錄。如果被盜領,銀行可以查到「這筆提款是在某個時間、某個地點發生的」,就能判斷是不是本人操作。
餘額欄位是必要的嗎?
你可能會問:「那餘額要存在哪裡?」
其實,餘額根本不需要另外儲存。
為什麼?因為餘額就是「所有存款金額加總 – 所有提款金額加總」的結果。只要把操作紀錄讀取出來,就可以算出餘額。
| 帳戶 | 時間 | 動作 | 金額 |
|---|---|---|---|
| 小明 | 3/15 09:00 | 存款 | 100 |
| 小明 | 3/15 10:30 | 提款 | 50 |
從這張表計算餘額:
- 存款總額:100
- 提款總額:50
- 餘額 = 100 – 50 = 50
換句話說:
餘額 = 讀取操作紀錄 + 計算
所以「計算」其實是「讀取」的延伸。你必須先讀取資料,才能進行計算。在資料庫操作的分類中,我們把「計算」和「讀取」視為同一種類型。
資料的更新與刪除
假設銀行確認你真的被盜領了,他們會怎麼處理?
直覺的做法是:把那筆盜領紀錄刪除。
| 帳戶 | 時間 | 動作 | 金額 |
|---|---|---|---|
| 小明 | 3/15 09:00 | 存款 | 100 |
但實際上銀行通常不會真的刪除資料,而是更新那筆紀錄,把它標記為「無效」或「盜刷」。
| 帳戶 | 時間 | 動作 | 金額 | 狀態 |
|---|---|---|---|---|
| 小明 | 3/15 09:00 | 存款 | 100 | 有效 |
| 小明 | 3/15 10:30 | 提款 | 50 | 無效(盜刷) |
為什麼不直接刪除?因為這筆紀錄本身還是有價值的:
- 可以追查盜刷發生的時間、地點
- 可以作為報案或調查的證據
- 可以統計盜刷的頻率和金額
所以銀行選擇「保留紀錄,但標記為無效」。計算餘額時,系統只會加總「狀態 = 有效」的紀錄,無效的紀錄就不會計入。
這就是「更新」和「刪除」的差異:
- 刪除:資料完全消失,無法復原
- 更新:資料還在,只是改變了某個欄位的值
CRUD:資料操作的四種類型
從上面的 ATM 例子,我們可以歸納出資料操作只有四種類型,可以分成兩大類:
資料的增減
這類操作會改變資料表中「有幾筆資料」。
Create(新增)
在資料表中新增一筆資料。
例如:
- 新增一筆提款紀錄
- 新增一個會員帳號
- 新增一筆訂單
Delete(刪除)
從資料表中刪除一筆資料。
例如:
- 刪除一筆錯誤的紀錄
- 刪除已經退會的會員
- 刪除過期的優惠券
現有資料的操作
這類操作不會改變資料筆數,只會針對已經存在的資料進行讀取或修改。
Read(讀取)
從資料表中讀取資料。
例如:
- 讀取帳戶的所有交易紀錄
- 查詢某個會員的資料
- 計算這個月的總銷售額(先讀取資料,再計算)
💡 「計算」其實也是讀取的一部分。你必須先讀取資料,才能進行計算。
Update(更新)
修改已經存在的資料。
例如:
- 把某筆紀錄標記為「無效」
- 修改會員的電話號碼
- 更新商品的價格
CRUD 與增刪改查
把這四種操作的英文字首排在一起:
| 操作 | 英文 | 中文 |
|---|---|---|
| C | Create | 新增 |
| R | Read | 讀取(查詢) |
| U | Update | 更新(修改) |
| D | Delete | 刪除 |
CRUD 唸起來像一個英文單字,所以大家都這樣叫。
中文的話,常見的說法是「增刪改查」或「增刪查改」,順序不太固定,但指的都是這四種操作。
這兩個詞你都要記得,因為:
- 聽到有人說 CRUD,就知道在講資料操作的四種類型
- 聽到有人說增刪改查,也是同樣的意思
CRUD 涵蓋所有資料操作
你可能會想:「真的只有這四種嗎?不會有第五種嗎?」
目前來說,所有的資料操作都可以歸類到這四種。不管你要做什麼,都是這四種的組合:
- 註冊帳號 → Create(新增一筆會員資料)
- 登入 → Read(讀取會員資料,驗證密碼)
- 改密碼 → Update(更新密碼欄位)
- 刪除帳號 → Delete(刪除會員資料)
再複雜的功能,拆解下來都是 CRUD 的組合。
欄位(Column)可以增減嗎?
前面我們學過,資料操作都是針對「列」(Row)來進行的:
- 新增一列資料
- 讀取某幾列資料
- 更新某一列的某個欄位
- 刪除某一列資料
那「欄位」(Column)可以隨意增減嗎?
一般來說,不建議輕易改動欄位。
為什麼?因為欄位定義了資料的結構。如果你隨意增減欄位,之前寫好的程式可能會出錯,之前的查詢邏輯也要跟著改。
所以在設計資料庫時,會建議:
- 一開始就想清楚需要哪些欄位
- 欄位確定後,盡量不要改動
但有些情況下,資料的「共同性質」並不固定,或者會一直變動,這時候傳統的表格設計就會遇到困難。
舉個例子,假設你要設計一個「商品」資料表:
- 書籍有:書名、作者、頁數、ISBN
- 衣服有:品名、尺寸、顏色、材質
- 食品有:品名、重量、有效期限、成分
這三種商品的「共同性質」完全不同。如果硬要用同一張表格來存,你可能要開很多欄位,但每筆資料都只會用到其中幾個欄位,其他都是空的。
這種情況下,傳統的「欄位固定」設計就會很彆扭。
這就牽涉到資料庫的不同流派:有些資料庫堅持「欄位要固定」,有些資料庫則允許「欄位可以彈性變動」。我們之後會再詳細介紹這兩種流派的差異。
小結
這篇文章介紹了資料操作的四種類型:
| 英文 | 中文 | 說明 |
|---|---|---|
| Create | 新增 | 在資料表中新增一筆資料 |
| Read | 讀取 | 從資料表中讀取資料 |
| Update | 更新 | 修改已經存在的資料 |
| Delete | 刪除 | 從資料表中刪除資料 |
這四種操作合稱 CRUD,中文叫「增刪改查」。
不管多複雜的系統,所有的資料操作都可以拆解成這四種類型的組合。記住這個觀念,之後學習 SQL 語法時,你會發現 SQL 的指令也是對應這四種操作。