05 SQL Alter
1. 定義
維基百科:SQL
Alter
指令用於已有資料表的修改,增加、修改和刪除資料表字段都可以通過 Alter 指令來完成。
解釋:Alter 使使用者可以修改已建立的資料表,但大多數情況下資料表字段和型別需要在定義的時候就確認,雖然 Alter 可以修改欄位的型別和約束,但不能過於依賴;Alter 更多的時候用於索引的新增和刪除。
2. 前言
本小節,我們將一起學習 SQL Alter
。
我們可以把 Alter 指令理解為一顆後悔藥
,很多時候因為業務的變更,通過 Create 建立的資料表不能滿足現在的需求,這時便吃上一顆後悔藥——修改資料表結構。
Alter 常用的操作主要有兩大類,分別是:欄位操作和索引操作。在小節中,我們也將按照這樣的順序來依次學習。
本小節測試資料如下,請先在資料庫中執行:
DROP TABLE IF EXISTS imooc_user;
CREATE TABLE imooc_user
(
username varchar(20),
age int
);
3. 欄位操作
欄位操作由新增欄位、修改欄位和刪除欄位三部分組成,它們語法類似,下面我們分別介紹。
3.1 新增欄位
Alter 新增欄位的語法如下:
ALTER TABLE [table_name] ADD ([col] [datatype]);
其中table_name
代表待修改的資料表,col
表示新增欄位名稱,datatype
為新增欄位型別。
3.2 例1、新增 score 欄位
請書寫 SQL 語句,為imooc_user
表新增一個score
欄位,欄位型別為float
。
分析:
按照 Alter 新增欄位語法,新增 score 欄位即可。
語句:
ALTER TABLE imooc_user ADD score float;
修改後,表資訊如下:
+----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(20) | YES | | <null> | | | age | int(11) | YES | | <null> | | | score | float | YES | | <null> | | +----------+-------------+------+-----+---------+-------+
3.3 修改欄位
Alter 修改欄位語法如下:
ALTER TABLE [table_name] MODIFY(COLUMN [col] [datatype]);
其中table_name
是待修改資料表名稱,col
是待修改欄位名,datatype
是將要修改的欄位型別。
3.4 例2、修改 username 欄位
請書寫 SQL 語句,修改上述的imooc_user
表,使username
欄位的型別從varchar(20)
變成varchar(30)
。
分析:
按照修改欄位的語法,修改 username 欄位型別修改即可。
語句:
ALTER TABLE imooc_user MODIFY COLUMN username varchar(30);
如果是在 PostgreSQL 中,修改語句稍有不同,如下:
ALTER TABLE imooc_user ALTER COLUMN username TYPE varchar(30);
修改後表資訊如下:
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(30) | YES | | <null> | |
| age | int(11) | YES | | <null> | |
+----------+-------------+------+-----+---------+-------+
我們也可以通過 ALTER 指令來修改欄位的約束,如為 age 欄位新增上 NOT NULL 和 DEFAULT約束:
ALTER TABLE imooc_user MODIFY COLUMN age int NOT NULL DEFAULT 18;
如果使用PostgreSQL,則語句如下:
ALTER TABLE imooc_user ALTER age SET NOT NULL;
ALTER TABLE imooc_user ALTER age SET DEFAULT 18;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(30) | YES | | <null> | |
| age | int(11) | NO | | 18 | |
+----------+-------------+------+-----+---------+-------+
3.5 刪除欄位
Alter 刪除欄位語法如下:
ALTER TABLE [table_name] DROP [col];
其中table_name
是待修改表的名稱,col
是待刪除欄位名。
3.6 例3、刪除 age 欄位
請書寫 SQL 語句,刪除imooc_user
表中的age
欄位。
分析:
按照語法刪除掉 age 欄位即可。
語句:
ALTER TABLE imooc_user DROP age;
刪除成功後,表資訊如下:
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(20) | YES | | <null> | |
+----------+-------------+------+-----+---------+-------+
4. 索引操作
索引操作由新增索引和刪除索引兩部分組成,如果你不瞭解索引,我們將會在 SQL 索引一節中詳細介紹。本小節我們只會介紹索引和 Alter 是如何搭配使用的。
4.1 新增索引
新增索引的語法如下:
ALTER TABLE [table_name] ADD INDEX [index_name] ([col]);
其中index_name
代表索引名稱,col
表示給那一欄位新增索引。
在 PostgreSQL 中,新增索引的語法有較大差異,如下:
CREATE INDEX [index_name] ON [table_name]([col]...);
4.2 例4、新增 age 索引
請書寫 SQL 語句,給imooc_user
表中的age
欄位新增索引。
分析:
按照語法給 age 欄位新增索引即可。
語句:
ALTER TABLE imooc_user ADD INDEX age_index (age);
PostgreSQL 語句如下:
CREATE INDEX age_index ON imooc_user(age);
新增成功後,表資訊如下:
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(20) | YES | | <null> | |
| age | int(11) | YES | MUL | <null> | |
+----------+-------------+------+-----+---------+-------+
我們可以為多個欄位新增一個索引,即聯合索引
,如下:
ALTER TABLE imooc_user ADD INDEX username_age_index (username, age);
PostgreSQL 語句如下:
CREATE INDEX username_age_index ON imooc_user(username,age);
新增成功後,表資訊如下:
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(20) | YES | MUL | <null> | |
| age | int(11) | YES | | <null> | |
+----------+-------------+------+-----+---------+-------+
4.3 刪除索引
刪除索引的語法如下:
ALTER TABLE [table_name] DROP INDEX [index_name];
其中index_name
代表索引名稱。
PostgreSQL 刪除索引語法如下:
DROP INDEX [index_name];
4.4 例5、刪除 username_age_index 索引
請書寫 SQL 語句,刪除imooc_user
表中的username_age_index
索引。
分析:
按照刪除索引語法刪除 username_age_index 索引即可。
語句:
ALTER TABLE imooc_user DROP INDEX username_age_index;
PostgreSQL 語句如下:
DROP INDEX username_age_index;
刪除成功後,表資訊如下:
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(20) | YES | | <null> | |
| age | int(11) | YES | | <null> | |
+----------+-------------+------+-----+---------+-------+
5. 個人經驗
- Alter 指令給了你吃後悔藥的權利,但不要過於依賴它,對於資料表字段的設計最好要在新建時就已經確定。
- Alter 指令修改資料表是十分消耗效能和時間的,請不要在線上工作時使用它。