PostgreSQL 完整教學 2026:什麼是 PostgreSQL?從 Docker 安裝、psql 常用指令、JSONB 到 pgvector 向量搜尋與備份還原一次學會

PostgreSQL 是最受歡迎的開源關聯式資料庫:免費、支援完整 SQL 標準,還能用 JSONB 存半結構化資料、用 pgvector 直接做 AI 向量搜尋——一套資料庫同時滿足傳統後端與 RAG 應用的需求。最新穩定版為 18.6(2026 年 8 月更新),19 正在 Beta 測試、預計 2026 年 9 月底正式發布。這篇 2026 年完整教學帶你從 Docker 安裝、psql 常用指令、建立資料表與 JSONB 實戰、備份還原,一路學到 pgvector 向量搜尋與效能調校基礎,適合後端開發者與自架族從零上手。

  • Dennis
  • 8 分鐘閱讀
PostgreSQL 完整教學 2026:什麼是 PostgreSQL?從 Docker 安裝、psql 常用指令、JSONB 到 pgvector 向量搜尋與備份還原一次學會

PostgreSQL 是一套免費開源的關聯式資料庫管理系統:支援完整 SQL 標準、事務(ACID)、JSONB 半結構化資料與 pgvector 向量搜尋,目前最新穩定版是 18.6(PostgreSQL 19 預計 2026 年 9 月底正式發布)。它常年位居 DB-Engines 排行榜前四名,是 2026 年「新專案預設資料庫」的首選——無論你要開發 Web API、分析資料,還是幫 AI 應用做 RAG 向量庫,PostgreSQL 都能一套搞定。

如果你在 most.tw 看過本站的自架系列,會發現一個現象:從 n8nVaultwarden 到各種 AI 工具,幾乎所有重量級開源專案都把 PostgreSQL 列為推薦資料庫——Supabase 這類「開源 Firebase」本質上就是把 PostgreSQL 包上一層好用的 API。這篇文章就從零開始,把 PostgreSQL 的原理與實戰一次講清楚。

PostgreSQL 是什麼?為什麼 2026 年值得學?

PostgreSQL(暱稱 Postgres)從 1996 年誕生至今已發展 30 年,是全球最成熟的開源資料庫。它與 MySQL 並列兩大開源主流,但近年聲勢明顯看漲,原因有三:

  1. 免費且功能齊全:不像 Oracle、SQL Server 要付授權費,Postgres 不只免費,功能還追上商業資料庫——視窗函數、CTE、部分索引、表分區、邏輯複寫樣樣都有。
  2. 一庫多用:用 JSONB 欄位就能同時存「文件」,不必為了半結構化資料另外養一套 MongoDB;用擴充套件(extensions)可以長出向量搜尋(pgvector)、全文檢索、地理資訊(PostGIS)等能力。
  3. AI 時代的基礎設施:RAG 應用要的向量資料庫、知識庫要的圖形查詢(PostgreSQL 19 加入 SQL/PGQ),Postgres 全部以「擴充套件」形式長出來——學一套,終身受用。

版本現況:18.6 穩定、19 即將報到

PostgreSQL 每年 9 月發布一個大版本,每個大版本支援 5 年。2026 年 9 月此刻的狀態:

版本狀態說明
PostgreSQL 18.6✅ 最新穩定版2025-09-25 首發,支援至 2030-11-14;2026-08-13 釋出 18.6
PostgreSQL 19🧪 Beta 3 測試中預計 2026 年 9 月底正式發布
PostgreSQL 17 / 16✅ 穩定分別支援至 2029-11 與 2028-11
PostgreSQL 14⚠️ 即將 EOL2026-11-12 停止支援,還在用的建議升級

PostgreSQL 18 的重點在 I/O 與可觀測性:全新的非同步 I/O 子系統、近乎重寫的 pg_stat_io 統計視圖、B-Tree 跳過掃描(Skip Scans,解決多欄位聯合索引的老問題)、分區表查詢規劃優化,以及 autovacuum 的「積極凍結」機制。

PostgreSQL 19 的重點轉向維運與開發體驗:支援 SQL:2023 標準的屬性圖查詢(SQL/PGQ,可直接用 MATCH 語法查詢圖譜關係)、原生 REPACK ... CONCURRENTLY(不用再裝第三方 pg_repack 就能在線重整肥大的表)、ALTER TABLE ... MERGE/SPLIT PARTITIONS 原生分區調整、UPDATE/DELETE ... FOR PORTION OF 時間區間操作,TOAST 預設壓縮也換成更快的 LZ4。

💡 升級提醒:PostgreSQL 大版本升級不能直接蓋過去的資料目錄,需要用 pg_dump 倒出再倒入,或官方 pg_upgrade 工具(Docker 使用者若把 volume 掛在 /var/lib/postgresql 父目錄,可搭配 pg_upgrade --link 更順暢地升級)。

第一步:用 Docker 安裝 PostgreSQL

Docker 是最快的安裝方式,也是本站所有自架服務的標準做法(不熟 Docker 可以先看這篇)。建立 compose.yaml

services:
  db:
    image: postgres:18        # 官方映像,直接指定大版本號
    container_name: postgres-dev
    environment:
      POSTGRES_PASSWORD: mysecretpassword   # 必填:superuser 密碼
      # POSTGRES_USER: postgres             # 選填,預設 postgres
      # POSTGRES_DB: myapp                  # 選填,預設建立的資料庫名
    ports:
      - "127.0.0.1:5432:5432"  # 只綁本機,避免資料庫暴露到公網
    volumes:
      - postgres_data:/var/lib/postgresql   # 命名 volume,資料持久化
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  postgres_data:

兩個關鍵細節(都是 Docker 官方文件的最佳實踐):

  • 掛載 /var/lib/postgresql 父目錄:PostgreSQL 18 起官方映像把資料放在版本專屬子目錄(如 /var/lib/postgresql/18/...)。掛載父目錄而非 /var/lib/postgresql/data,未來升級大版本時才能用 pg_upgrade --link 免倒檔升級。
  • 只用 127.0.0.1 綁定:除非你真的要對外提供資料庫服務,否則別寫 "5432:5432"——把資料庫暴露到公網是資安災難的起點。

啟動並驗證:

docker compose up -d
docker compose exec db psql -U postgres -c "SELECT version();"
# 看到 PostgreSQL 18.6 ... 就代表成功了

想在本機(非 Docker)安裝?Ubuntu/Debian 一行搞定:sudo apt install postgresql,安裝後服務自動啟動,用 sudo -u postgres psql 進入管理介面。

psql 常用指令速查表

psql 是 PostgreSQL 的命令列客戶端,以下是最常用的操作:

指令功能
psql -U postgres -d myapp連線(-h 可指定主機)
\l列出所有資料庫
\c myapp切換到 myapp 資料庫
\dt列出目前資料庫的所有資料表
\d 表名顯示資料表結構(欄位、索引、約束)
\du列出所有使用者與角色
\q離開 psql

建立資料庫與使用者、授權是每天都會用到的操作:

-- 建立使用者與資料庫(在 postgres 預設庫執行)
CREATE USER myuser WITH PASSWORD 'mypassword';
CREATE DATABASE myapp OWNER myuser;

-- 授權:資料庫層級要帶 DATABASE 關鍵字
GRANT CONNECT, CREATE ON DATABASE myapp TO myuser;

⚠️ 與 MySQL 不同:PostgreSQL 的 GRANT ... ON DATABASE 不會自動授權裡面的資料表,表格權限要另外在該資料庫內設定(GRANT SELECT, INSERT, UPDATE, DELETE ON 表名 TO myuser;)。初學者最常卡關的就是這裡。

第一個資料表:CRUD 與 JSONB 實戰

建立一個簡單的產品表,順便示範 Postgres 的招牌能力——JSONB 半結構化欄位:

-- 切換到 myapp 資料庫後執行
CREATE TABLE products (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,  -- 現代寫法,取代老舊 SERIAL
    name TEXT NOT NULL,
    price NUMERIC(10,2) NOT NULL,
    attributes JSONB,              -- 彈性的結構化欄位:放規格、標籤等
    created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- 插入:JSONB 欄位直接丟 JSON 物件
INSERT INTO products (name, price, attributes)
VALUES ('無線機械鍵盤', 2990, '{"layout": "75%", "switch": "茶軸", "wireless": true}');

-- 查詢 JSONB 內容(-> 回傳 JSON,->> 回傳純文字)
SELECT name, attributes->>'switch' AS 軸體
FROM products
WHERE attributes->>'wireless' = 'true';

JSONB 最強的地方是可以直接對文件內容建立索引,用 GIN 索引加速查詢:

CREATE INDEX idx_products_attrs ON products USING GIN (attributes);
-- 之後 WHERE attributes @> '{"wireless": true}' 這類查詢就會走索引

PostgreSQL 的設計哲學是「關聯式為主、文件為輔」:需要強一致與 JOIN 的資料用正規表格,欄位會變來變去的用 JSONB——兩者還能混合查詢。想比較 Postgres 與嵌入式資料庫 SQLite分析型 DuckDB 的定位差異,可以參考文末表格。

索引與 EXPLAIN:效能調校的第一步

查詢變慢時,先別急著加硬體。用 EXPLAIN ANALYZE 看執行計畫:

EXPLAIN ANALYZE SELECT * FROM products WHERE price > 1000;

輸出會告訴你 PostgreSQL 是「Seq Scan」(全表掃描)還是「Index Scan」。建立索引的方式:

CREATE INDEX idx_products_price ON products (price);       -- B-Tree(預設)
CREATE INDEX idx_products_name_lower ON products (lower(name));  -- 函式索引

PostgreSQL 的預設 B-Tree 索引涵蓋九成以上需求;JSONB 用 GIN、全文檢索用 GIN、向量用 HNSW/IVFFlat(下面介紹)。索引不是越多越好——寫入會變慢、磁碟會變肥,觀察實際查詢再建立即可。

日常維護方面,PostgreSQL 的 autovacuum 會自動清理死資料列(MVCC 的副作用),通常不需要手動介入;只有當你發現表異常肥大、查詢越來越慢時,才需要研究 vacuum 與 bloat 問題。

pgvector:AI 時代的向量搜尋

這是 2026 年學 PostgreSQL 最大的理由:裝一個擴充套件,你的關聯式資料庫立刻變成向量資料庫,可以直接為 RAG(檢索增強生成)應用服務,不必另外架設專用向量庫。

啟用方式(使用官方含 pgvector 的映像,或本機 CREATE EXTENSION):

# Docker:改用 pgvector 官方映像(已內建擴充套件)
# image: pgvector/pgvector:pg18
-- 1. 啟用擴充套件
CREATE EXTENSION IF NOT EXISTS vector;

-- 2. 建立含向量欄位的資料表(以 OpenAI embedding 常見的 1536 維為例)
CREATE TABLE documents (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    content TEXT NOT NULL,
    embedding vector(1536)
);

-- 3. 插入向量(把文字丟給 embedding API 產生向量後存入)
INSERT INTO documents (content, embedding)
VALUES ('PostgreSQL 是開源關聯式資料庫', '[0.012, -0.034, ...]'::vector);

-- 4. 相似度搜尋:<=> 是餘弦距離運算子,越小越相似
SELECT id, content, embedding <=> '[0.010, -0.030, ...]'::vector AS distance
FROM documents
ORDER BY embedding <=> '[0.010, -0.030, ...]'::vector
LIMIT 5;

百萬級向量請加上 HNSW 索引(查詢從秒級降到毫秒級):

CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);

把 pgvector 接進 RAG 管線的完整架構大概是這樣:

flowchart LR
    A[文件/PDF] --> B[切塊 Chunking]
    B --> C[Embedding API]
    C --> D[(PostgreSQL + pgvector)]
    E[使用者問題] --> F[Embedding API]
    F --> G[向量相似度搜尋]
    D --> G
    G --> H[Top-K 相關片段]
    H --> I[LLM 生成回答]
    style D fill:#336791,color:#fff

如果你在找「哪個向量資料庫比較適合我的專案」,這篇何謂 Vector Database 文章可以參考——但多數新專案的答案其實是:先別急著引進新系統,Postgres + pgvector 就夠了。

備份與還原:pg_dump 標準流程

PostgreSQL 官方備份工具是 pg_dump。小資料庫用純 SQL 格式即可,正式環境建議用自訂格式(-F c)或目錄格式(-F d,支援壓縮與選擇性還原:

# Docker 環境:進到容器內執行
docker compose exec db pg_dump -U postgres -F c -d myapp -f /tmp/myapp.dump
docker compose cp db:/tmp/myapp.dump ./backup-$(date +%F).dump

# 大資料庫用目錄格式 + 平行備份(-j 4 = 4 個執行緒)
pg_dump -F d -j 4 -d myapp -f /backup/myapp_dir/

# 還原(先建立空的資料庫)
pg_restore -U postgres -d myapp /tmp/myapp.dump
# 目錄格式可平行還原:pg_restore -j 4 -d myapp /backup/myapp_dir/

進階一點,用 cron 每天備份 + 保留最近 7 份,是自架服務的基本衛生習慣;需要即時複本的話再研究 streaming replication 或邏輯複寫。

PostgreSQL vs MySQL vs SQLite:怎麼選?

比較項PostgreSQLMySQLSQLite
定位功能完整的伺服器資料庫普及度高的伺服器資料庫嵌入式單檔資料庫
授權PostgreSQL License(免費)GPL(甲骨文持有)公有領域
JSON 支援JSONB(二進位、可索引)JSON 類型(功能較弱)JSONB(v3.45+ 強化)
擴充套件極豐富(pgvector/PostGIS…)較少編譯期內建
適合場景新專案預設、複雜查詢、AI/RAG既有生態、代管服務(AWS RDS)單機工具、原型、邊緣裝置
本站教學✅ 本篇SQLite 完整教學

一句話總結:沒有特別理由就用 PostgreSQL——這是 2026 年開源社群的主流共識;SQLite 留給單機小工具,MySQL 留給你已經很熟的既有環境。

總結:PostgreSQL 學習路徑

flowchart LR
    A[Docker 安裝] --> B[psql 與 CRUD]
    B --> C[JSONB 文件實戰]
    C --> D[索引與 EXPLAIN]
    D --> E[pg_dump 備份]
    D --> F[pgvector 向量搜尋]
    E --> G[日常維運與調校]
    F --> G

PostgreSQL 的學習曲線比 SQLite 陡一點,但投資報酬率極高:它是 2026 年最多新專案預設的資料庫、Supabase 等 BaaS 的底層、也是 AI 應用向量檢索的事實標準之一。照著本篇走完 Docker 安裝 → psql → JSONB → 索引 → pgvector → 備份,你就已經具備把任何 side project 或公司服務架在 PostgreSQL 上的完整能力了。

原始來源PostgreSQL 官方版本政策PostgreSQL 18.6/19 Beta 3 發布公告Docker Docs: PostgreSQL specific guidePostgreSQL 18 vs 19 功能比較(Jatin Jainsaraf)pgvector GitHub

延伸閱讀

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友