SQL 資料表管理
在 MySQL 中,資料表的管理主要使用 **DDL(Data Definition Language,資料定義語言)**,常見指令包括:
- `CREATE TABLE`:建立資料表
- `ALTER TABLE`:修改資料表結構
- `DROP TABLE`:刪除資料表
- `TRUNCATE TABLE`:清空資料表資料,但保留表結構
以下以 `students` 資料表為例。
---
## 一、選擇資料庫
建立或操作資料表前,先選擇要使用的資料庫:
```sql
USE school;
```
如果資料庫尚未建立,可以先執行:
```sql
CREATE DATABASE school;
USE school;
```
---
## 二、建立資料表
### 1. 基本語法
```sql
CREATE TABLE 資料表名稱 (
欄位名稱 資料型別 [限制條件],
欄位名稱 資料型別 [限制條件],
...
);
```
### 2. 建立範例
```sql
CREATE TABLE students (
student_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
birth_date DATE,
gender CHAR(1),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (student_id)
);
```
說明:
- `INT`:整數型別
- `VARCHAR(50)`:最多 50 個字元的字串
- `DATE`:日期
- `NOT NULL`:欄位不可為空值
- `UNIQUE`:欄位值不可重複
- `AUTO_INCREMENT`:每次新增資料時自動遞增
- `PRIMARY KEY`:主鍵,用來唯一識別每筆資料
- `DEFAULT CURRENT_TIMESTAMP`:預設使用目前時間
### 3. 建立資料表並設定外鍵
```sql
CREATE TABLE courses (
course_id INT NOT NULL AUTO_INCREMENT,
course_name VARCHAR(100) NOT NULL,
teacher_id INT,
PRIMARY KEY (course_id),
FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id)
);
```
其中 `teacher_id` 是外鍵,參照 `teachers` 資料表的 `teacher_id` 欄位。
### 4. 避免資料表已存在時發生錯誤
```sql
CREATE TABLE IF NOT EXISTS students (
student_id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
```
---
## 三、查看資料表結構
### 查看資料表清單
```sql
SHOW TABLES;
```
### 查看資料表欄位結構
```sql
DESCRIBE students;
```
或:
```sql
DESC students;
```
### 查看完整建表語法
```sql
SHOW CREATE TABLE students;
```
---
## 四、修改資料表
修改資料表通常使用 `ALTER TABLE`。
### 1. 新增欄位
```sql
ALTER TABLE students
ADD phone VARCHAR(20);
```
在指定欄位後新增:
```sql
ALTER TABLE students
ADD address VARCHAR(200) AFTER email;
```
在第一個位置新增:
```sql
ALTER TABLE students
ADD status VARCHAR(20) FIRST;
```
---
### 2. 修改欄位資料型別或限制
MySQL 可使用 `MODIFY COLUMN`:
```sql
ALTER TABLE students
MODIFY COLUMN name VARCHAR(100) NOT NULL;
```
也可以使用 `CHANGE COLUMN` 同時修改欄位名稱:
```sql
ALTER TABLE students
CHANGE COLUMN name full_name VARCHAR(100) NOT NULL;
```
差異:
- `MODIFY COLUMN`:只修改欄位定義,不修改名稱
- `CHANGE COLUMN`:可以修改欄位名稱與定義
---
### 3. 修改欄位名稱
```sql
ALTER TABLE students
RENAME COLUMN full_name TO student_name;
```
此語法適用於較新版本的 MySQL。也可以使用:
```sql
ALTER TABLE students
CHANGE COLUMN full_name student_name VARCHAR(100) NOT NULL;
```
---
### 4. 刪除欄位
```sql
ALTER TABLE students
DROP COLUMN phone;
```
刪除欄位前應確認其中的資料不再需要,因為欄位及其資料會一併消失。
---
### 5. 新增主鍵
```sql
ALTER TABLE students
ADD PRIMARY KEY (student_id);
```
如果原本已有主鍵,必須先刪除原主鍵:
```sql
ALTER TABLE students
DROP PRIMARY KEY;
```
---
### 6. 新增唯一索引
```sql
ALTER TABLE students
ADD CONSTRAINT unique_email UNIQUE (email);
```
也可以使用:
```sql
CREATE UNIQUE INDEX unique_email
ON students (email);
```
---
### 7. 新增一般索引
```sql
CREATE INDEX idx_student_name
ON students (student_name);
```
索引可以提升查詢速度,但過多索引可能降低新增、修改資料的效能。
---
### 8. 新增外鍵
```sql
ALTER TABLE courses
ADD CONSTRAINT fk_teacher
FOREIGN KEY (teacher_id)
REFERENCES teachers(teacher_id);
```
如果需要設定級聯操作:
```sql
ALTER TABLE courses
ADD CONSTRAINT fk_teacher
FOREIGN KEY (teacher_id)
REFERENCES teachers(teacher_id)
ON DELETE CASCADE
ON UPDATE CASCADE;
```
- `ON DELETE CASCADE`:被參照資料刪除時,相關資料一併刪除
- `ON UPDATE CASCADE`:被參照鍵值更新時,相關資料一併更新
---
### 9. 修改資料表名稱
```sql
RENAME TABLE students TO school_students;
```
或:
```sql
ALTER TABLE school_students
RENAME TO students;
```
---
## 五、刪除資料表
### 1. 刪除資料表
```sql
DROP TABLE students;
```
此操作會刪除:
- 資料表結構
- 所有資料
- 索引
- 約束
通常無法直接復原,因此執行前應先備份。
### 2. 只有資料表存在時才刪除
```sql
DROP TABLE IF EXISTS students;
```
### 3. 一次刪除多個資料表
```sql
DROP TABLE students, courses;
```
若資料表之間有外鍵關聯,可能需要先刪除子表,或暫時關閉外鍵檢查:
```sql
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE students, courses;
SET FOREIGN_KEY_CHECKS = 1;
```
使用時應特別小心,避免破壞資料關聯。
---
## 六、清空資料表但保留結構
如果只想刪除資料,不刪除資料表:
```sql
TRUNCATE TABLE students;
```
`TRUNCATE TABLE` 與 `DELETE` 的差異:
```sql
DELETE FROM students;
```
| 指令 | 結果 |
|---|---|
| `DELETE FROM students` | 逐筆刪除資料,可搭配 `WHERE` |
| `TRUNCATE TABLE students` | 快速清空全部資料,不可搭配 `WHERE` |
| `DROP TABLE students` | 刪除資料表及其結構 |
例如只刪除特定資料:
```sql
DELETE FROM students
WHERE student_id = 3;
```
---
## 七、完整操作範例
```sql
CREATE DATABASE IF NOT EXISTS school;
USE school;
CREATE TABLE IF NOT EXISTS students (
student_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE students
ADD phone VARCHAR(20);
ALTER TABLE students
MODIFY COLUMN name VARCHAR(100) NOT NULL;
CREATE INDEX idx_students_name
ON students (name);
DESC students;
-- 清空所有資料,但保留資料表
TRUNCATE TABLE students;
-- 刪除資料表
DROP TABLE IF EXISTS students;
```
操作 `DROP TABLE`、`TRUNCATE TABLE` 或刪除欄位前,建議先確認資料並進行備份,以免造成不可逆的資料遺失。
相關學習地圖、教學課程
Python 後端工程、資料庫