上一篇文章介紹了一對一、一對多、多對多三種關係類型,也學會了怎麼設計表單來記錄這些關係。
但有個問題:我們怎麼確保這些關係是正確的?
例如會員和電話是「一對多」的關係,一支電話只能被一個會員持有。但如果有人不小心把同一支電話填了兩次,分別屬於不同會員,怎麼辦?
這篇文章會介紹資料庫的「限制」功能,幫助我們自動防止這種錯誤。
一對多關係要怎麼確保?
回顧一下會員和電話的關係:
- 一個會員最多可以有很多支電話
- 一支電話最多只能被一個會員持有
我們用兩張表單來記錄這個關係:
會員表單:
| 會員 ID | 會員名稱 |
|---|---|
| U001 | David |
| U002 | Emily |
會員電話表單:
| 電話 | 會員 ID |
|---|---|
| 0912-345-678 | U001 |
| 0922-111-222 | U001 |
| 0923-456-789 | U002 |
從表單設計來看,一支電話只會出現一次,對應到一個會員 ID。這樣就能確保「一支電話只能被一個會員持有」。
但問題來了:如果有人不小心把同一支電話填了兩次呢?
| 電話 | 會員 ID |
|---|---|
| 0912-345-678 | U001 |
| 0922-111-222 | U001 |
| 0912-345-678 | U002 |
這樣 0912-345-678 這支電話就同時屬於 David 和 Emily,違反了「一支電話只能被一個會員持有」的規則。
用 UNIQUE 限制防止重複
好消息是,關聯式資料庫可以幫我們的欄位加上「限制」。
其中一種限制叫做 UNIQUE(不重複)。
當你對某個欄位設定 UNIQUE 限制,資料庫就會自動檢查:這個欄位的值不能重複。
如果有人試圖新增一筆資料,但這個值已經存在了,資料庫就會拒絕,不讓這筆資料存進來。
在電話欄位加上 UNIQUE
我們在「會員電話表單」的「電話」欄位加上 UNIQUE 限制:
會員電話表單:
| 電話(UNIQUE) | 會員 ID |
|---|---|
| 0912-345-678 | U001 |
| 0922-111-222 | U001 |
現在如果有人想新增一筆「0912-345-678 / U002」的資料,資料庫會說:
「不行!0912-345-678 已經存在了,違反 UNIQUE 限制,這筆資料不能存進來。」
這樣就能自動確保「一支電話只能被一個會員持有」了。
UNIQUE 限制的好處
自動檢查,不用擔心人為疏失
不用靠人工檢查「這支電話有沒有被用過」,資料庫會自動幫你檢查。
資料一定正確
只要設定了 UNIQUE 限制,就不可能出現重複的值。資料庫會強制執行這個規則。
在源頭就擋住錯誤
錯誤的資料根本存不進來,不用等到之後才發現問題、再花時間修正。
什麼時候要用 UNIQUE?
當你想確保「某個欄位的值不能重複」時,就可以用 UNIQUE。
常見的例子:
- 電話:一支電話只能屬於一個會員
- Email:一個 Email 只能註冊一個帳號
- 身分證字號:雖然現實中有重複的情況,但如果你的系統規定不能重複,就可以用 UNIQUE
- VIP 編號:每個 VIP 編號只能對應一個會員
UNIQUE 限制重點整理
這篇文章介紹了 UNIQUE 限制的概念:
- 問題:表單設計好了,但怎麼確保資料不會違反規則?
- 解法:在欄位上加 UNIQUE 限制
- 效果:資料庫會自動檢查,如果值已存在就拒絕新增
- 好處:自動檢查、資料一定正確、在源頭擋住錯誤
- 使用時機:當你想確保某個欄位的值不能重複時
UNIQUE 是資料庫「限制」功能的其中一種。後續的文章會繼續介紹其他種類的限制,幫助我們確保資料的正確性。