🗄️ SQLite

輕量嵌入式 SQL 資料庫(單檔案)

SQLite 不需要獨立伺服器程序,整個資料庫就是一個檔案,適合開發測試、行動應用、桌面程式與讀多寫少的小型 Web 應用。

安裝

$ sudo apt install -y sqlite3
sqlite3 --version
3.39.2 2022-07-21

基本操作

$ sqlite3 myapp.db          # 開啟(不存在則建立)
-- SQLite 殼層指令(以 . 開頭,不需分號)
.tables          -- 列出所有資料表
.schema users    -- 查看資料表結構
.headers on      -- 顯示欄位名稱
.mode column     -- 以欄位對齊格式顯示
.quit            -- 離開
$ # 直接執行 SQL(非互動模式)
sqlite3 myapp.db "SELECT * FROM users LIMIT 5;"

# 匯入 SQL 腳本
sqlite3 myapp.db < schema.sql

常用 SQL

-- 建立資料表
CREATE TABLE users (
    id      INTEGER PRIMARY KEY AUTOINCREMENT,
    name    TEXT    NOT NULL,
    email   TEXT    UNIQUE NOT NULL,
    created DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 建立索引
CREATE INDEX idx_users_email ON users(email);

-- 插入
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');

-- 查詢
SELECT * FROM users WHERE name LIKE 'A%' ORDER BY created DESC LIMIT 10;

-- 更新
UPDATE users SET name = 'Bob' WHERE id = 1;

-- 刪除
DELETE FROM users WHERE id = 1;

-- 交易(批次操作必備,大幅提升效能)
BEGIN TRANSACTION;
  INSERT INTO orders ...;
  INSERT INTO order_items ...;
COMMIT;

備份

$ # 方法 1:直接複製檔案(先確認無寫入中的程序)
cp myapp.db myapp_$(date +%Y%m%d).db

# 方法 2:線上備份(最安全,支援執行中的資料庫)
sqlite3 myapp.db ".backup /backup/myapp_$(date +%Y%m%d).db"

# 方法 3:匯出為 SQL
sqlite3 myapp.db .dump > myapp_$(date +%Y%m%d).sql

效能與注意事項

⚠️ SQLite 使用檔案層級鎖,同時只能有一個寫入者。高並發寫入場景(如多執行緒 Web 應用)請改用 PostgreSQL 或 MySQL。
-- 常用效能優化 PRAGMA
PRAGMA journal_mode = WAL;     -- WAL 模式:讀寫可並行(強烈建議)
PRAGMA synchronous = NORMAL;   -- WAL 模式下的最佳同步設定
PRAGMA cache_size = -64000;    -- 快取大小(-64000 = 64MB)
PRAGMA foreign_keys = ON;      -- 啟用外鍵約束(預設關閉!)
PRAGMA temp_store = MEMORY;    -- 暫存資料使用記憶體

WAL(Write-Ahead Logging)模式讓讀取與寫入可以同時進行,是 SQLite 最重要的效能調整,應在每次連線建立時設定。