在前幾堂課我們已經打下關於關聯式資料庫和 PostgreSQL 的基礎,學會怎麼用 psql 跟 pgAdmin,也會建立和管理資料庫。現在輪到我們來建立關聯式資料庫的主要「建材」——資料表啦。資料表就是用來存放所有資訊的地方,之後我們可以對這些資料做篩選、排序或合併。
在 PostgreSQL 裡可以用 CREATE TABLE 指令來建立資料表。這個指令會描述資料表的結構:它的名字、欄位還有每個欄位的資料型別。
指令的基本結構
基本語法長這樣:
CREATE TABLE 資料表 (
欄位1 資料型別 constraints,
欄位2 資料型別 constraints,
...
);
來拆解一下:
資料表– 資料表的名字(例如students)。欄位1– 欄位名稱(例如id、name)。資料型別– 欄位的資料型別(例如INTEGER、VARCHAR)。constraints– 資料的限制條件(例如NOT NULL、PRIMARY KEY)。
現在我們來建立第一個資料表。
建立資料表的範例
情境:在學習用的資料庫裡要存學生的資料。為此我們來建立一個 students 資料表,欄位如下:
id:學生的唯一識別碼(自動遞增);name:學生名字(字串長度最多 100 個字元);age:學生年齡(正整數)。
CREATE TABLE students (
id SERIAL PRIMARY KEY, -- 學生唯一 ID
name VARCHAR(100), -- 名字
age INTEGER -- 年齡
);
這裡發生了什麼:
id SERIAL PRIMARY KEY:建立一個id欄位,會自動產生唯一的數字(1, 2, 3...)給每一列,同時它也是這個資料表的主鍵。name VARCHAR(100):建立一個文字欄位,VARCHAR(100)代表字串最多 100 個字元。age INTEGER:建立一個數字欄位來存年齡。
現在如果你在 psql 或 pgAdmin 執行這個指令,students 資料表就會被建立。
欄位的資料型別
建立資料表時,選對每個欄位的資料型別很重要。PostgreSQL 有很多型別可以選,這裡先介紹最常用的幾個。
| 資料型別 | 說明 | 範例值 |
|---|---|---|
INTEGER |
整數。很適合用來存年齡、數量、識別碼。 | 1, 42, 100 |
VARCHAR(n) |
長度最多 n 的字串。很適合有限長度的文字。 |
'Alice', 'Bob' |
TEXT |
沒有限制長度的字串。用來存很長的文字(像是產品描述)。 | 'Very long text...' |
DATE |
只有日期沒有時間。用來記錄生日、事件日期。 | 2023-10-12 |
BOOLEAN |
布林值:TRUE 或 FALSE。常用來當旗標(像是完成/未完成)。 |
TRUE, FALSE |
怎麼選資料型別
- 如果你要存數字——用
INTEGER。 - 有長度限制的字串——選
VARCHAR(n)。 - 沒有限制的文字——用
TEXT。 - 日期和時間就用
DATE或TIMESTAMP。
範例:建立 courses 資料表
假設我們的資料庫也要存課程的資訊。每個課程有:
id:唯一識別碼;name:課程名稱(最多 100 個字元的字串);description:課程描述(長文字);start_date:課程開始日期。
SQL 範例:
CREATE TABLE courses (
id SERIAL PRIMARY KEY, -- 課程唯一 ID
name VARCHAR(100), -- 課程名稱
description TEXT, -- 描述
start_date DATE -- 開始日期
);
實作練習
現在換你來建立資料表!這是你的任務:
- 建立一個
teachers資料表,欄位有:id:唯一識別碼。name:老師名字(最多 50 個字元的字串)。subject:他/她教的科目(最多 50 個字元的字串)。hire_date:聘用日期。
可以參考這段 SQL:
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
subject VARCHAR(50),
hire_date DATE
);
執行完之後,在 psql 裡用 \d teachers 指令確認資料表有被建立。
建立資料表時常見的錯誤
剛開始玩資料表時,常常會遇到一些錯誤。這裡列幾個常見的狀況:
資料表或欄位名稱打錯。 在 PostgreSQL 裡名字不分大小寫,但如果你用 " 把名字包起來,就要很小心。例如 CREATE TABLE "MyTable" 會建立 "MyTable" 這個資料表,但 mytable 就不會被認出來是它。
資料型別寫錯。 如果你寫了一個不存在的資料型別,指令會報錯。
CREATE TABLE example (
column1 STRANGE_TYPE
);
這個指令不會成功,因為 STRANGE_TYPE 根本不存在。
忘記 PRIMARY KEY。 如果你忘了加主鍵,資料表還是會被建立,但之後要辨識每一列就會比較麻煩。
GO TO FULL VERSION