CREATE TABLE 與資料型態
CREATE TABLE — 建立你的第一張表
比喻:CREATE TABLE 就像設計 Excel 表頭 📋
在填資料之前,你得先決定有哪些欄位、每欄放什麼類型的資料。 CREATE TABLE 就是在做這件事。
基本語法
CREATE TABLE Students ( -- ← 建立 Students 表
Id SERIAL PRIMARY KEY, -- ← 自動遞增的主鍵
Name VARCHAR(50) NOT NULL, -- ← 最多 50 字的字串,不可為空
Age INT, -- ← 整數
Email VARCHAR(100) UNIQUE, -- ← 最多 100 字,不可重複
Score DECIMAL(5,2), -- ← 總 5 位數,小數 2 位
IsActive BOOLEAN DEFAULT true, -- ← 布林值,預設 true
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- ← 自動記錄建立時間
);
逐行解析:
Id SERIAL PRIMARY KEY -- SERIAL = 自動遞增整數(1, 2, 3...)
-- PRIMARY KEY = 主鍵,每筆唯一
Name VARCHAR(50) NOT NULL -- VARCHAR(50) = 可變長度字串,最多 50 字
-- NOT NULL = 這欄一定要有值,不能留空
Email VARCHAR(100) UNIQUE -- UNIQUE = 不能重複(兩人不能同 email)
Score DECIMAL(5,2) -- DECIMAL(5,2) = 最多 5 位數,其中 2 位小數
-- 例如 999.99(可以),10000.0(不行,超過 5 位)
IsActive BOOLEAN DEFAULT true -- DEFAULT = 沒填的話自動用這個值
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 自動填入當前時間
常用資料型態
數字類型
-- 整數
SMALLINT -- -32,768 ~ 32,767(2 bytes)
INT / INTEGER -- -21 億 ~ 21 億(4 bytes)← 最常用
BIGINT -- 超大整數(8 bytes)
SERIAL -- 自動遞增 INT(PostgreSQL)
BIGSERIAL -- 自動遞增 BIGINT
-- 小數
DECIMAL(10,2) -- 精確小數(金額用這個!)
NUMERIC(10,2) -- 同 DECIMAL
REAL -- 浮點數(有誤差)
DOUBLE PRECISION -- 雙精度浮點數
字串類型
CHAR(10) -- 固定長度 10 字元(不夠補空白)
VARCHAR(100) -- 可變長度,最多 100 字元 ← 最常用
TEXT -- 無長度限制的字串(適合存文章)
日期時間
DATE -- 日期(2024-01-15)
TIME -- 時間(14:30:00)
TIMESTAMP -- 日期 + 時間(2024-01-15 14:30:00)
INTERVAL -- 時間間隔(2 hours, 3 days)
其他
BOOLEAN -- true / false
UUID -- 全球唯一識別碼
JSON / JSONB -- JSON 格式資料(PostgreSQL)
BYTEA -- 二進位資料(檔案、圖片)
約束(Constraints)
CREATE TABLE Orders (
Id SERIAL PRIMARY KEY, -- 主鍵約束
OrderNo VARCHAR(20) NOT NULL UNIQUE, -- 非空 + 唯一
CustomerId INT NOT NULL, -- 外鍵欄位
Amount DECIMAL(10,2) CHECK (Amount > 0), -- 檢查約束
Status VARCHAR(20) DEFAULT 'pending', -- 預設值
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- 外鍵約束(獨立宣告)
CONSTRAINT fk_customer
FOREIGN KEY (CustomerId)
REFERENCES Customers(Id)
ON DELETE CASCADE -- 客戶被刪時,訂單也刪
);
約束一覽
| 約束 | 用途 | 範例 |
|---|---|---|
PRIMARY KEY |
主鍵,唯一且非空 | Id SERIAL PRIMARY KEY |
NOT NULL |
不可為空 | Name VARCHAR(50) NOT NULL |
UNIQUE |
不可重複 | Email VARCHAR(100) UNIQUE |
DEFAULT |
預設值 | Status DEFAULT 'active' |
CHECK |
條件檢查 | CHECK (Age >= 0) |
FOREIGN KEY |
外鍵,參照別的表 | REFERENCES Customers(Id) |
ALTER TABLE — 修改表結構
-- 新增欄位
ALTER TABLE Students
ADD COLUMN Phone VARCHAR(20); -- ← 加一欄電話
-- 刪除欄位
ALTER TABLE Students
DROP COLUMN Phone; -- ← 移除電話欄位
-- 修改欄位型態
ALTER TABLE Students
ALTER COLUMN Name TYPE VARCHAR(100); -- ← 把名字長度改成 100
-- 新增約束
ALTER TABLE Students
ADD CONSTRAINT uq_email UNIQUE (Email);
-- 重新命名欄位
ALTER TABLE Students
RENAME COLUMN Name TO FullName;
DROP TABLE — 刪除表
DROP TABLE Students; -- ⚠️ 整張表消失!
DROP TABLE IF EXISTS Students; -- 如果存在才刪(避免錯誤)
⚠️ DROP TABLE 是不可逆的!請搭配備份使用。