Database 管理
## 一、MySQL Database 的概念
在 MySQL 中,**Database(資料庫)** 是一組資料表(Table)、檢視表(View)、預存程序(Stored Procedure)、函式(Function)、觸發器(Trigger)等資料庫物件的集合。
簡單來說:
- **Database**:資料的邏輯容器
- **Table**:實際儲存資料的表格
- **Column(欄位)**:資料的屬性
- **Row(資料列)**:一筆資料
- **Schema**:在 MySQL 中通常可視為 Database 的同義詞
例如,可以建立一個名為 `school` 的資料庫,裡面包含:
```text
school
├── students
├── teachers
└── courses
```
---
## 二、查看 MySQL 中的 Database
### 1. 查看所有 Database
```sql
SHOW DATABASES;
```
或:
```sql
SHOW SCHEMAS;
```
### 2. 查看目前使用的 Database
```sql
SELECT DATABASE();
```
如果尚未選擇資料庫,結果會是 `NULL`。
### 3. 使用指定的 Database
```sql
USE school;
```
選擇後,後續建立或操作資料表時,預設會在 `school` 資料庫中執行。
---
# 三、新增 Database
## 1. 基本語法
```sql
CREATE DATABASE database_name;
```
例如:
```sql
CREATE DATABASE school;
```
這會建立名為 `school` 的資料庫。
---
## 2. 建議使用字元集與排序規則
```sql
CREATE DATABASE school
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
```
說明:
- `CHARACTER SET utf8mb4`:設定字元集,支援中文與 Emoji
- `COLLATE utf8mb4_unicode_ci`:設定字串排序與比較規則
- `ci` 通常表示不區分大小寫(case-insensitive)
在較新的 MySQL 版本,也可使用:
```sql
CREATE DATABASE school
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
```
---
## 3. 避免資料庫已存在時發生錯誤
```sql
CREATE DATABASE IF NOT EXISTS school;
```
如果 `school` 已存在,MySQL 不會重新建立,也不會產生錯誤。
---
## 4. 查看 Database 的建立設定
```sql
SHOW CREATE DATABASE school;
```
可能得到類似結果:
```sql
CREATE DATABASE `school`
/*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
```
---
# 四、修改 Database
MySQL 中,Database 本身可修改的項目主要是:
1. 預設字元集
2. 預設排序規則
3. 部分資料庫屬性
## 1. 修改預設字元集
```sql
ALTER DATABASE school
CHARACTER SET utf8mb4;
```
## 2. 修改預設排序規則
```sql
ALTER DATABASE school
COLLATE utf8mb4_unicode_ci;
```
## 3. 同時修改字元集與排序規則
```sql
ALTER DATABASE school
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
```
也可以使用:
```sql
ALTER SCHEMA school
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
```
`ALTER DATABASE` 與 `ALTER SCHEMA` 在 MySQL 中作用相同。
> 注意:修改 Database 的預設字元集與排序規則,主要會影響之後新建的資料表或欄位;通常不會自動轉換現有資料表的欄位設定。若要修改既有資料表,需另外使用 `ALTER TABLE`。
例如:
```sql
ALTER TABLE students
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
```
---
## 4. MySQL 是否能直接重新命名 Database?
MySQL 沒有一般性的:
```sql
RENAME DATABASE old_name TO new_name;
```
這種標準指令。
若要更改 Database 名稱,通常做法是:
1. 建立新的 Database
2. 將資料表搬移或匯出、匯入
3. 確認資料完整後刪除舊 Database
例如搬移單一資料表:
```sql
RENAME TABLE old_db.students
TO new_db.students;
```
但若資料庫中包含許多資料表、檢視表、觸發器或其他物件,建議使用 `mysqldump` 匯出再匯入。
---
# 五、刪除 Database
## 1. 基本語法
```sql
DROP DATABASE database_name;
```
例如:
```sql
DROP DATABASE school;
```
此操作會刪除:
- Database
- Database 中的所有資料表
- 所有資料
- View、Trigger 等相關物件
這是一項**不可逆的危險操作**。
---
## 2. 避免資料庫不存在時發生錯誤
```sql
DROP DATABASE IF EXISTS school;
```
如果 `school` 不存在,MySQL 不會產生錯誤。
---
## 3. 刪除前先確認
可以先查看資料庫:
```sql
SHOW DATABASES;
```
查看資料庫中的資料表:
```sql
USE school;
SHOW TABLES;
```
必要時先備份:
```bash
mysqldump -u root -p school > school_backup.sql
```
之後可以使用備份檔案還原:
```bash
mysql -u root -p school < school_backup.sql
```
---
# 六、常用 Database 管理指令整理
| 操作 | SQL 指令 |
|---|---|
| 查看所有 Database | `SHOW DATABASES;` |
| 建立 Database | `CREATE DATABASE school;` |
| 建立且避免重複錯誤 | `CREATE DATABASE IF NOT EXISTS school;` |
| 選擇 Database | `USE school;` |
| 查看目前 Database | `SELECT DATABASE();` |
| 查看建立設定 | `SHOW CREATE DATABASE school;` |
| 修改字元集 | `ALTER DATABASE school CHARACTER SET utf8mb4;` |
| 修改排序規則 | `ALTER DATABASE school COLLATE utf8mb4_unicode_ci;` |
| 刪除 Database | `DROP DATABASE school;` |
| 刪除且避免不存在錯誤 | `DROP DATABASE IF EXISTS school;` |
---
# 七、完整範例
```sql
-- 1. 建立資料庫
CREATE DATABASE IF NOT EXISTS school
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 2. 選擇資料庫
USE school;
-- 3. 查看目前使用的資料庫
SELECT DATABASE();
-- 4. 修改資料庫預設排序規則
ALTER DATABASE school
COLLATE utf8mb4_unicode_ci;
-- 5. 查看資料庫設定
SHOW CREATE DATABASE school;
-- 6. 確認後刪除資料庫
DROP DATABASE IF EXISTS school;
```
執行 `DROP DATABASE` 前應確認資料是否已備份,因為資料庫一旦刪除,通常無法直接復原。
相關學習地圖、教學課程
Python 後端工程、資料庫