本文 AI 產出,尚未審核
MySQL 教學 – 資料庫與資料表操作
主題:CREATE DATABASE / DROP DATABASE
簡介
在 MySQL 中,**資料庫(Database)**是所有資料表、索引、儲存程序等物件的容器。建立與刪除資料庫是每個開發者、資料庫管理員(DBA)必須熟悉的基本操作。
- 建立資料庫讓你有一個乾淨的工作空間,能夠依照專案需求設定字元編碼、排序規則(collation),確保資料正確儲存與比較。
- 刪除資料庫則是清理測試環境、回收磁碟空間或在部署流程中「重新建置」時常用的步驟。
如果對這兩個指令的語法與使用情境不清楚,容易導致 資料遺失、編碼錯誤 或 部署失敗。本篇文章將從概念、實作範例、常見陷阱與最佳實踐,一步步帶你掌握 CREATE DATABASE 與 DROP DATABASE 的正確用法,讓你在日常開發與運維中更得心應手。
核心概念
1. CREATE DATABASE 的基本語法
CREATE DATABASE database_name;
database_name必須符合 MySQL 的命名規則(字母、數字、底線,且不能以數字開頭)。- 若未指定字元編碼與排序規則,MySQL 會使用 伺服器預設(
character_set_server、collation_server),這在多語系環境下常會引發問題。
常見的擴充語法
| 語法 | 說明 |
|---|---|
CREATE DATABASE IF NOT EXISTS db_name; |
若資料庫已存在則不產生錯誤,適合自動化腳本。 |
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
明確指定 UTF‑8(4 位元)編碼與 Unicode 排序,避免中文、表情符號亂碼。 |
CREATE DATABASE db_name ENCRYPTION='Y'; |
在支援 Transparent Data Encryption (TDE) 的 MySQL 8.0+ 中啟用磁碟加密。 |
2. DROP DATABASE 的基本語法
DROP DATABASE database_name;
- 危險性:此指令會一次刪除資料庫內所有資料表、資料、索引、觸發器等,且 無法復原(除非事先備份)。
- 為降低誤刪的風險,建議在腳本中加入
IF EXISTS檢查,或在執行前先SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA;確認目標。
常見的擴充語法
| 語法 | 說明 |
|---|---|
DROP DATABASE IF EXISTS db_name; |
若資料庫不存在則不產生錯誤,避免腳本中斷。 |
DROP DATABASE db_name RESTRICT; |
預設行為,僅在資料庫內無任何物件時才允許刪除(MySQL 會自動 cascade)。 |
DROP DATABASE db_name FORCE; |
MySQL 8.0+ 才支援,用於強制刪除正在被其他連線使用的資料庫(需謹慎)。 |
3. 權限與安全性
- 建立或刪除資料庫需要
CREATE或DROP權限,通常授予CREATE、DROP、ALTER、INDEX等給特定使用者。 - 範例:
GRANT CREATE, DROP ON *.* TO 'dev_user'@'%' IDENTIFIED BY 'StrongPass!';
4. 使用範例
以下示範 5 個實務上常見的 CREATE DATABASE / DROP DATABASE 操作,並以註解說明每一步的目的與注意事項。
範例 1:建立開發環境的測試資料庫(含編碼設定)
-- 建立一個名稱為 test_dev 的資料庫,使用 utf8mb4 編碼,避免中文與 Emoji 亂碼
CREATE DATABASE IF NOT EXISTS test_dev
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
範例 2:在部署腳本中安全刪除舊版測試資料庫
-- 若舊的測試資料庫存在,先刪除它
DROP DATABASE IF EXISTS test_dev_old;
-- 接著建立新的測試資料庫(與範例 1 相同的設定)
CREATE DATABASE test_dev_old
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
範例 3:使用 MySQL 8.0 的磁碟加密功能
-- 建立一個加密的資料庫,適用於儲存敏感資料(如金流紀錄)
CREATE DATABASE secure_data
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
ENCRYPTION='Y';
範例 4:批次刪除多個測試資料庫(自動化腳本)
-- 假設有三個測試資料庫需要同時移除
DROP DATABASE IF EXISTS test_a;
DROP DATABASE IF EXISTS test_b;
DROP DATABASE IF EXISTS test_c;
範例 5:檢查資料庫是否存在再執行操作(結合資訊模式)
-- 先查詢資訊模式(INFORMATION_SCHEMA)確認資料庫是否真的存在
SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'prod_db';
-- 若結果為空,表示資料庫不存在,可安全執行 CREATE
CREATE DATABASE prod_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
常見陷阱與最佳實踐
| 陷阱 | 可能的後果 | 解決方案 / 最佳實踐 |
|---|---|---|
忘記指定 CHARACTER SET |
中文、表情符號變成 ? 或亂碼 |
永遠在建立資料庫時明確設定 utf8mb4,除非有特殊需求。 |
直接使用 DROP DATABASE 而未備份 |
數據永久遺失 | 先執行 mysqldump 或 SELECT INTO OUTFILE 進行備份,再刪除。 |
在生產環境誤執行 DROP DATABASE |
服務中斷、商業損失 | 使用 READ ONLY 帳號或 --dry-run 模式 檢查腳本;將關鍵指令寫入版本控制。 |
| 未授予適當權限 | 建立/刪除失敗,影響 CI/CD 流程 | 為自動化帳號 最小化授權(只給 CREATE、DROP),同時使用 WITH GRANT OPTION 需更謹慎。 |
| 資料庫名稱大小寫不一致(在 Windows vs Linux) | 找不到資料庫、腳本失敗 | 統一使用小寫,或在 MySQL 設定 lower_case_table_names=1(依平台調整)。 |
最佳實踐總結:
- 明確指定編碼與排序規則(
utf8mb4+utf8mb4_unicode_ci)避免未來遷移問題。 - 使用
IF NOT EXISTS / IF EXISTS,降低腳本因重複執行而中斷。 - 在刪除前備份,或在測試環境使用
DROP DATABASE,生產環境則採RENAME DATABASE(MySQL 8.0+)或ALTER DATABASE ...方案。 - 將資料庫操作寫入版本控制(SQL migration tools 如 Flyway、Liquibase),確保可回溯與審計。
- 最小權限原則:僅授予需要執行
CREATE/DROP的帳號,避免濫用。
實際應用場景
| 場景 | 為什麼需要 CREATE/DROP DATABASE |
典型流程 |
|---|---|---|
| CI/CD 測試環境自動化 | 每次測試前需要一個乾淨的資料庫,測試結束後清理以節省資源。 | 1. DROP DATABASE IF EXISTS test_ci; 2. CREATE DATABASE test_ci CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 3. 執行測試套件。 |
| 多租戶 SaaS 平台 | 為每個客戶建立獨立的資料庫,確保資料隔離與安全。 | 在新客戶註冊時:CREATE DATABASE tenant_123 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;;客戶關閉帳號時:DROP DATABASE tenant_123;(先備份)。 |
| 資料遷移或升級 | 需要在新資料庫中重建結構,再切換流量。 | 1. CREATE DATABASE new_ver CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2. 匯入資料(mysqldump) 3. 切換應用程式連線字串。 |
| 加密敏感資料 | 合規需求(PCI DSS、GDPR)要求磁碟加密。 | CREATE DATABASE finance_db ENCRYPTION='Y' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
| 臨時資料分析 | 資料科學家需要臨時資料庫來跑 ETL,完成後即刪除。 | CREATE DATABASE analytics_tmp; → 執行 ETL → DROP DATABASE analytics_tmp; |
總結
CREATE DATABASE與DROP DATABASE是 MySQL 中最基礎、同時也是最具破壞性的指令。- 正確的編碼設定、安全的刪除流程、以及最小權限原則是避免常見問題的關鍵。
- 透過
IF NOT EXISTS / IF EXISTS、事前備份、以及將指令納入版本控制,你可以在 開發、測試、部署 各階段穩定且可預測地管理資料庫。 - 最後,別忘了在實務中把 資料庫操作 視為 基礎建設,配合自動化工具(如 Flyway、Liquibase)與 CI/CD 流程,讓資料庫的生命週期管理同樣享有 可重現、可回溯 的好處。
祝你在 MySQL 的世界裡,打造出既安全又高效的資料庫環境! 🚀