上一篇我們介紹了 Pseudo Code 的表示方式,讓你知道接下來的語法要怎麼看。
從這篇開始,我們要正式學習如何操作資料庫了。
在資料庫裡面,操作分成兩個層級:
- 表單層級:對整張表做新增、修改、刪除
- 資料層級:對表裡面的每一筆資料做新增、查詢、修改、刪除
這篇文章會先從「表單操作」開始。
表單操作的範圍
當我們說「操作表單」的時候,不是只有對表單本身做事情。
一張表單裡面會有欄位。
欄位上面可以設定限制,像是 PRIMARY KEY、FOREIGN KEY、UNIQUE 等等。
另外還有「型別」,也就是這個欄位要存什麼類型的資料,像是文字、數字、時間等等。
因為同一個欄位裡面,每一筆資料的性質都一樣(例如「姓名」這個欄位,每一筆都是文字),所以我們會在一開始就把型別固定下來。
整理一下,表單操作的範圍包含:
表單本身:
- 新增一張表單
- 刪除一張表單
- 重新命名表單
欄位:
- 新增欄位
- 刪除欄位
- 重新命名欄位
欄位的型別:
- 設定型別(這個欄位要存什麼類型的資料)
- 變更型別
欄位的限制:
- 新增限制(像是 PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK 等等)
- 移除限制
💡 小提醒:表單操作用的英文字,跟資料操作用的不一樣,等一下會特別說明。
創建表單:CREATE TABLE
要建立一張新的表單,我們用 CREATE TABLE 這個指令。
基本語法
CREATE TABLE {表單名稱} (
{欄位名稱} 型別 [限制],
{欄位名稱} 型別 [限制],
...
);在看完整範例之前,我們先來了解幾個重要的概念。
欄位可以設定什麼?
每個欄位可以設定這些東西:
- 型別(必填):這個欄位要存什麼類型的資料
- 限制(選填):這個欄位有什麼規則
- 預設值(選填):如果沒填值,要自動填入什麼
接下來一個一個說明。
型別
型別就是這個欄位要存什麼類型的資料。
常見的型別有:
- 字串:文字資料,例如姓名、地址
- 數字:數值資料,例如年齡、價格
- 時間:日期時間資料,例如建立時間、生日
這些型別是資料庫本身就有的,你不需要自己定義,只要從裡面選一個來用就好。
每個欄位一定要設定型別,這是必填的。
限制
限制就是這個欄位的規則。
常見的限制有:
- PRIMARY KEY:主鍵,這個欄位的值不能重複,用來識別每一筆資料
- FOREIGN KEY:外鍵,這個欄位的值必須參照另一張表的某個欄位
- UNIQUE:這個欄位的值不能重複
- CHECK:自訂驗證規則,例如規定年齡必須大於等於 18 歲,不符合條件的資料就無法存進去
預設值 DEFAULT
有時候你希望某個欄位在沒有填值的情況下,自動幫你填上一個值。
這時候就可以用 DEFAULT。
常見的用法有兩個:
- 主鍵自動產生 UUID:每次新增一筆資料,id 就會自動產生一個不重複的編號
- 建立時間自動填入現在時間:每次新增一筆資料,就會自動記錄當下的時間
完整範例
了解了上面這些概念之後,我們來看怎麼寫一個完整的 CREATE TABLE。
第一步:寫出 CREATE TABLE 和表單名稱
語法:
CREATE TABLE {表單名稱}範例:
CREATE TABLE 講師這樣就告訴資料庫:我要建立一張叫「講師」的表單。
第二步:用圓括號包住所有欄位
語法:
CREATE TABLE {表單名稱} (
...
)範例:
CREATE TABLE 講師 (
...
)圓括號在 SQL 裡面通常代表「一組東西」,你可以把它想成一個清單。
在這裡,圓括號裡面放的就是「這張表單有哪些欄位」的清單。
第三步:填入欄位和型別
語法:
CREATE TABLE {表單名稱} (
{欄位名稱} 型別
);範例:
CREATE TABLE 講師 (
姓名 字串
);
一個欄位只要寫「欄位名稱」和「型別」就好。
這樣就建立了一張「講師」表單,裡面有一個「姓名」欄位,型別是字串。
第四步:加入更多欄位
語法:
CREATE TABLE {表單名稱} (
{欄位名稱} 型別,
{欄位名稱} 型別
);範例:
CREATE TABLE 講師 (
id 字串,
姓名 字串
);如果有多個欄位,用逗號隔開。
第五步:加上限制和預設值
語法:
CREATE TABLE {表單名稱} (
{欄位名稱} 型別 [限制] [DEFAULT 預設值],
{欄位名稱} 型別
);範例:
CREATE TABLE 講師 (
id 字串 PRIMARY KEY DEFAULT UUID(),
姓名 字串
);這裡的 id 欄位設定了:
PRIMARY KEY:這是主鍵DEFAULT UUID():如果沒填值,自動產生一個不重複的編號
第六步:加上建立時間
範例:
CREATE TABLE 講師 (
id 字串 PRIMARY KEY DEFAULT UUID(),
姓名 字串,
建立時間 時間 DEFAULT NOW()
);這裡的 建立時間 欄位用 DEFAULT NOW() 設定預設值。
每次新增一筆資料,就會自動記錄當下的時間。
第七步:加上 CHECK 限制
範例:
CREATE TABLE 會員 (
id 字串 PRIMARY KEY DEFAULT UUID(),
姓名 字串,
年齡 數字 CHECK (年齡 >= 18),
建立時間 時間 DEFAULT NOW()
);這裡的 年齡 欄位用 CHECK (年齡 >= 18) 設定限制。
如果有人想填入 17 歲,資料庫就會拒絕,不讓這筆資料存進去。
變更表單:ALTER TABLE
表單建好之後,你可能還需要做一些修改。
這時候用 ALTER TABLE 這個指令。
ALTER 是「變更」的意思,所以 ALTER TABLE 就是「變更表單」。
創建 vs 變更的差別
| 創建表單 | 變更表單 | |
|---|---|---|
| 指令 | CREATE TABLE | ALTER TABLE |
| 操作對象 | 表單 + 欄位一起設定 | 可以分開處理 |
創建表單的時候,我們是同時設定「表單」和「欄位」,一次完成。
但在變更表單的時候,可以分開處理:
- 針對「表單本身」做變更
- 針對「欄位」做變更
變更表單可以做什麼?
表單本身:
- 重新命名表單
欄位:
- 重新命名欄位
- 新增欄位
- 移除欄位
- 變更欄位型別
- 新增欄位限制
- 移除欄位限制
接下來一個一個看語法怎麼寫。
重新命名
有時候表單或欄位的名稱取得不好,或是需求改變了,就會需要重新命名。
重新命名表單
語法:
ALTER TABLE {舊表單名稱}
RENAME TO {新表單名稱};範例:
ALTER TABLE 講師
RENAME TO 教師;重新命名欄位
語法:
ALTER TABLE {表單名稱}
RENAME COLUMN {舊欄位名稱} TO {新欄位名稱};範例:
ALTER TABLE 講師
RENAME COLUMN 姓名 TO 講師姓名;新增與移除欄位
隨著系統的發展,你可能會需要在現有的表單中加入新的欄位,或是把不需要的欄位移除。
新增欄位
語法:
ALTER TABLE {表單名稱}
ADD COLUMN {欄位名稱} 型別 [限制];範例:假設補習班開了新的據點,我們需要記錄每個講師屬於哪個據點。
ALTER TABLE 講師
ADD COLUMN 據點id 字串 FOREIGN KEY REFERENCES 據點(id);移除欄位
語法:
ALTER TABLE {表單名稱}
DROP COLUMN {欄位名稱};範例:
ALTER TABLE 講師
DROP COLUMN 據點id;⚠️ 警告:移除欄位是很危險的操作。如果這個欄位被其他表單的 FOREIGN KEY 參照,強制刪除可能會出問題。動手之前,請先確認這個欄位沒有被其他地方使用。
變更欄位的型別與限制
有時候欄位的型別或限制需要調整,例如原本存數字的欄位改成存字串,或是要加上新的限制。
變更型別
語法:
ALTER TABLE {表單名稱}
ALTER COLUMN {欄位名稱} TYPE {新型別};新增限制
語法:
ALTER TABLE {表單名稱}
ALTER COLUMN {欄位名稱} SET {限制};移除限制
語法:
ALTER TABLE {表單名稱}
ALTER COLUMN {欄位名稱} DROP {限制};刪除表單:DROP TABLE
如果你要把一整張表單刪掉,用 DROP TABLE。
DROP TABLE {表單名稱};就這麼簡單,一行指令,整張表就消失了。
⚠️ 警告:DROP TABLE 是非常危險的操作。刪掉就是刪掉了,沒有資源回收桶可以找回來。
在執行 DROP 之前,請確認:
- 這張表真的不需要了嗎?
- 有沒有其他程式在讀這張表的資料?
- 有沒有其他表的 FOREIGN KEY 指向這張表?
如果不確定,先問問前輩或同事再動手。
實戰範例:建立補習班系統
讓我們用前面學過的語法,實際建立一個補習班系統的資料庫。
建立基本表單
補習班系統需要記錄講師、學生、課程這些資料,所以我們先建立這三張表單。
建立講師表
CREATE TABLE 講師 (
id 字串 PRIMARY KEY DEFAULT UUID(),
姓名 字串
);建立學生表
CREATE TABLE 學生 (
id 字串 PRIMARY KEY DEFAULT UUID(),
姓名 字串
);建立課程表
CREATE TABLE 課程 (
id 字串 PRIMARY KEY DEFAULT UUID(),
科目 字串,
年級 數字
);💡 為什麼年級用數字?因為之後可能會需要排序(例如按年級高低排列),用數字比較方便。
建立關係表
講師和課程之間有「誰教哪堂課」的關係,學生和課程之間有「誰選了哪堂課」的關係。
這些關係需要用關係表來記錄。
建立講授表(講師 ↔ 課程)
CREATE TABLE 講授 (
id 字串 PRIMARY KEY DEFAULT UUID(),
課程id 字串 FOREIGN KEY REFERENCES 課程(id),
講師id 字串 FOREIGN KEY REFERENCES 講師(id)
);建立選課表(學生 ↔ 課程)
CREATE TABLE 選課 (
id 字串 PRIMARY KEY DEFAULT UUID(),
課程id 字串 FOREIGN KEY REFERENCES 課程(id),
學生id 字串 FOREIGN KEY REFERENCES 學生(id)
);到這裡,補習班系統的基本架構就建立完成了。
加入「據點」功能
假設補習班擴大了,有多個據點,我們需要記錄每個講師屬於哪個據點。
建立據點表
CREATE TABLE 據點 (
id 字串 PRIMARY KEY DEFAULT UUID(),
名稱 字串
);在講師表加入據點欄位
ALTER TABLE 講師
ADD COLUMN 據點id 字串 FOREIGN KEY REFERENCES 據點(id);這樣講師表就多了一個欄位,可以記錄每個講師屬於哪個據點。
同樣的,學生表和教室表如果也需要記錄據點,也是用一樣的方式加入欄位。
加入「學生上限」
假設每堂課有人數限制,我們需要在課程表加入一個欄位:
ALTER TABLE 課程
ADD COLUMN 學生上限 數字;合併講師表和學生表
假設系統改版,決定把「講師」和「學生」合併成一張「人員」表,用「身份」欄位來區分。
這時候有兩種做法:
做法一:建立新表,搬移資料
直接建立一張新的「人員」表,然後把講師和學生的資料搬過去。
做法二:改名 + 加欄位
保留其中一張表,改名後加入新欄位,再把另一張表的資料搬過來。
以做法二為例:
把講師表改名為人員表
ALTER TABLE 講師
RENAME TO 人員;加入身份欄位
ALTER TABLE 人員
ADD COLUMN 身份 字串;搬移資料
接下來要做的事情是:
- 把人員表裡原本的資料,身份都填上「講師」
- 把學生表的資料搬到人員表,身份填上「學生」
這部分涉及到「資料操作」,會在下一篇文章介紹。
更新其他表的 FOREIGN KEY
因為講師表已經改名為人員表,所以其他有參照講師表的地方也要更新。
例如講授表原本參照的是「講師」表,現在要改成參照「人員」表:
ALTER TABLE 講授
ALTER COLUMN 講師id SET FOREIGN KEY REFERENCES 人員(id);移除學生表?
資料都搬完之後,學生表是不是要刪掉?
建議先不要急著刪。
可以先保留一段時間,確認沒有其他程式還在用這張表,再決定要不要移除。
💡 在實務上,刪除表單是很危險的操作。如果不確定,先問問前輩或同事。
小結
這篇文章介紹了表單層級的三個操作:
| 操作 | 指令 | 用途 |
|---|---|---|
| 新增 | CREATE TABLE | 建立新表單 |
| 修改 | ALTER TABLE | 改名、加欄位、改限制 |
| 刪除 | DROP TABLE | 移除整張表單 |
幾個重點提醒:
- 建立欄位時,一定要設定型別
- DEFAULT 可以設定預設值,常用於 id 和建立時間
- CHECK 可以做資料驗證
- DROP 操作要非常小心,刪掉就回不來了
下一篇我們會進入資料層級的操作,學習如何新增、查詢、修改、刪除資料。