雖然圖形化工具普及,但掌握原生 SQL DDL(CREATE、ALTER、DROP)仍是資料庫工程師的基本功。本文從登入、建庫、查看引擎、建表、修改表結構、刪除表的完整流程,搭配實戰範例與最佳實踐,打造堅實的 DDL 基礎。
1. 登入 MySQL
mysql -h localhost -u root -p
# -h 主機 (預設 localhost 可省略)
# -u 使用者
# -p 密碼 (輸入後隱藏顯示)
2. 資料庫基本操作
-- 查看現有資料庫
SHOW DATABASES;
-- 建立資料庫 (建議指定字符集)
CREATE DATABASE `example` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 刪除資料庫 (謹慎!)
DROP DATABASE `example`;
3. 存儲引擎認知與選型
SHOW ENGINES;
| 引擎 | 支援 | 事務 | 鎖粒度 | 外鍵 | 適用場景 |
| InnoDB | DEFAULT | ✅ | 行鎖 | ✅ | 核心業務、高併發、需 ACID |
| MyISAM | YES | ❌ | 表鎖 | ❌ | 唯讀、日誌、全文搜尋(舊版) |
| MEMORY | YES | ❌ | 表鎖 | ❌ | 暫存表、快取、查找表 |
| ARCHIVE | YES | ❌ | 行鎖 | ❌ | 海量日誌、寫一次讀少 |
| CSV | YES | ❌ | 表鎖 | ❌ | 外部資料交換 |
InnoDB 是 5.5+ 預設且唯一支援事務的通用引擎,無特殊理由請直接用 InnoDB。
4. 建表實戰範本
CREATE TABLE `users` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`username` VARCHAR(50) NOT NULL COMMENT '用戶名',
`email` VARCHAR(100) NOT NULL COMMENT '信箱',
`password_hash` CHAR(60) NOT NULL COMMENT 'bcrypt 雜湊',
`status` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1啟用 0停用',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
UNIQUE KEY `uk_email` (`email`),
KEY `idx_status_created` (`status`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用戶表';
建表黃金法則
- 主鍵:
BIGINT UNSIGNED AUTO_INCREMENT,無業務含義
- 字符集:統一
utf8mb4 + utf8mb4_unicode_ci(或 0900_ai_ci)
- 非空:業務必要欄位加
NOT NULL + DEFAULT
- 註釋:表、欄位皆加
COMMENT
- 索引:依查詢模式建立組合索引,遵循最左前綴
5. 修改表結構
| 操作 | 語法範例 | 備註 |
| 新增欄位 | ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email; | AFTER 指定位置,可選 |
| 修改欄位型別/屬性 | ALTER TABLE users MODIFY COLUMN phone VARCHAR(30) NOT NULL DEFAULT ''; | 大表會鎖表重建,慎用 |
| 重命名欄位 | ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(20); | 需重複完整定義 |
| 刪除欄位 | ALTER TABLE users DROP COLUMN mobile; | 資料永久遺失 |
| 新增索引 | ALTER TABLE users ADD INDEX idx_email (email); | 大表考慮 ALGORITHM=INPLACE |
| 刪除索引 | ALTER TABLE users DROP INDEX idx_email; | |
| 修改引擎 | ALTER TABLE users ENGINE=InnoDB; | 大表參考「建新表遷移」 |
| 修改字符集 | ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4; | 必須用 CONVERT TO |
| 重命名表 | RENAME TABLE users TO app_users; | 原子操作,極快 |
6. 刪除表
-- 刪除表結構與資料 (不可回復)
DROP TABLE `users`;
-- 僅清空資料,保留結構 (可回滾、觸發器觸發、自增不重置)
DELETE FROM `users`;
-- 僅清空資料,保留結構 (不可回滾、不觸發觸發器、自增重置、極快)
TRUNCATE TABLE `users`;
7. 線上變更表結構 (Online DDL) 最佳實踐
- MySQL 5.6+ 支援
ALGORITHM=INPLACE、LOCK=NONE 多數操作無鎖
- 大表變更:
pt-online-schema-change (Percona Toolkit) 或 gh-ost (GitHub) 影子表法
- 變更前:備份、評估鎖影響、預留回滾方案、低峰期執行
DDL 雖簡單,但大表一操作就是生產事故。養成「先測試、再備份、分批改、可回滾」的肌肉記憶,才是資料庫工程師的專業素養。
copyright ©
萬盛學電腦網 all rights reserved