iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0

確定了每個欄位的資料型態後,今天要進入 WSL2 的 Ubuntu 環境實作。會先建立專案資料夾架構,並透過 Claude Code 輔助撰寫 schema.sql 建立腳本與執行外鍵關聯設定。

專案架構

在開始寫 SQL 前,先規劃好專案目錄結構,方便未來管理資料庫腳本與 PHP 核心程式。

library-system/
├── config/             # 資料庫連線與系統設定檔
├── sql/                # 資料庫初始化腳本
│   └── schema.sql      # 資料庫建表與外鍵 SQL
├── public/             # 網頁入口與前端頁面
└── src/                # 商業邏輯與功能模組

根據架構在 WSL2 中建立資料夾

mkdir -p library-system/sql library-system/config library-system/public library-system/src

查看目錄

ls

建立並檢查目錄
進入專案目錄

cd library-system

什麼是 Schema?為什麼要寫 SQL 腳本?

  • Schema(資料庫綱要):就像是建築藍圖,定義了資料表欄位、資料型態與外鍵約束等「規則」,但不包含資料本身。

  • 為什麼寫 SQL 腳本 schema.sql:

    1. 一鍵建置:未來不論部署到哪裡,指令一下就能重現整個資料庫。
    2. 版本控制:可放入 Git 追蹤結構修改歷程。
    3. 方便 AI 讀取:AI 看一眼 schema.sql 就能掌握全貌,寫出精準對應欄位的 PHP 程式碼。

透過 Claude Code 輔助生成 SQL 腳本

接下來在專案目錄下啟動 Claude Code,下以下指令讓它建立 sql/schema.sql 腳本:

對 Claude Code 下的 Prompt:

請幫我在 sql/schema.sql 建立資料庫初始化腳本:
1. 資料庫:建立並使用 library_system (utf8mb4)。
2. 資料表欄位:
   - books: id (INT PK AI), title, author, isbn (UNIQUE), publish_year, category, total, available
   - members: id (INT PK AI), name, email (UNIQUE), password, role, created_at
   - loans: id (INT PK AI), member_id, book_id, borrowed_at, due_date, returned_at, status
3. 外鍵限制:loans 置於最後建表,並設定具名外鍵:
   - CONSTRAINT fk_loans_member FOREIGN KEY (member_id) REFERENCES members(id) ON DELETE CASCADE
   - CONSTRAINT fk_loans_book FOREIGN KEY (book_id) REFERENCES books(id) ON DELETE CASCADE

sql/schema.sql 腳本:

-- 1. 建立資料庫與選擇使用
CREATE DATABASE IF NOT EXISTS library_system
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;

USE library_system;

-- 2. 建立書籍表 (books)
CREATE TABLE IF NOT EXISTS books (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    title         VARCHAR(255) NOT NULL,
    author        VARCHAR(255) NOT NULL,
    isbn          VARCHAR(20) NOT NULL UNIQUE,
    publish_year  INT,
    category      VARCHAR(100),
    total         INT NOT NULL DEFAULT 0,     -- 館藏總數量
    available     INT NOT NULL DEFAULT 0,     -- 目前可借數量(total 扣掉借出中的本數)
    created_at    TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- 3. 建立會員表 (members)
CREATE TABLE IF NOT EXISTS members (
    id         INT AUTO_INCREMENT PRIMARY KEY,
    name       VARCHAR(100) NOT NULL,
    email      VARCHAR(255) NOT NULL UNIQUE,
    password   VARCHAR(255) NOT NULL,
    role       VARCHAR(20) NOT NULL DEFAULT 'member',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- 4. 建立借閱表 (loans),須在 books、members 建立後才能建立外鍵
CREATE TABLE IF NOT EXISTS loans (
    id          INT AUTO_INCREMENT PRIMARY KEY,
    member_id   INT NOT NULL,
    book_id     INT NOT NULL,
    borrowed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    due_date    DATE NOT NULL,
    returned_at DATETIME,
    status      VARCHAR(20) NOT NULL DEFAULT 'borrowed', -- 借閱狀態,例如 'borrowed'(借出中)、'returned'(已歸還)
    CONSTRAINT fk_loans_member FOREIGN KEY (member_id) REFERENCES members(id) ON DELETE CASCADE,
    CONSTRAINT fk_loans_book FOREIGN KEY (book_id) REFERENCES books(id) ON DELETE CASCADE
) ENGINE=InnoDB;

登入 MySQL:

sudo mysql -u root

查看資料表:

USE library_system;
SHOW TABLES;

查看資料表
查看具名外鍵:

SHOW CREATE TABLE loans\G

查看具名外建
在輸出結果中確認腳本包含以下兩行,代表具名外鍵與資料表架構已建置完成:

CONSTRAINT `fk_loans_member` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_loans_book` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE CASCADE

WSL2 環境採坑:

在 WSL2 執行 schema.sql 匯入時,遭遇了 Job for mysql.service failed 錯誤。

出現這行錯誤訊息:[ERROR] Can't start server: Bind on TCP/IP port: Address already in use (port: 3306)

原因是 Windows 主機 Port 衝突,我已經在 Windows 本地環境安裝過 MySQL,其背景服務在電腦開機時就自動鎖定了 3306 Port。
用 Windows 工作管理員解決:

  1. 按下快捷鍵 Ctrl + Shift + Esc 開啟 Windows 工作管理員。
  2. 切換至「服務」分頁
  3. 在列表中尋找 MySQL 或 MySQL80 服務。
  4. 點擊右鍵選擇 「停止」,釋放 3306 通訊埠。

完成以上步驟後,回到 WSL2 執行 sudo service mysql start 重新啟動 Linux 版 MySQL,就可以執行匯入指令了。


今天完成了 books、members 與 loans 的 Schema 建置與外鍵,目前資料庫的骨架已經搭好,明天會撰寫腳本將測試資料正式匯入資料表中,讓整個系統真正動起來。


上一篇
Day 7 欄位型態怎麼定
下一篇
Day 9 灌假資料
系列文
從零打造圖書管理系統:WSL2 × MySQL × Claude Code 的整合實作 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言