擴充閱讀
MySQL 00 View
MySQL 01 Ruler mysql 日常開發規範
MySQL 02 truncate table 與 delete 清空表的區別和坑
MySQL 03 Expression 1 of ORDER BY clause is not in SELECT list,references column
MySQL 04 EMOJI 表情與 UTF8MB4 的故事
MySQL 05 MySQL入門教程(MySQL tutorial book)
MySQL 06 mysql 如何實現類似 oracle 的 merge into
MySQL 07 timeout 超時異常
MySQL 08 datetime timestamp 以及如何自動更新,如何實現範圍查詢
MySQL 09 MySQL-09-SP mysql 儲存過程
MySQL 09 MySQL-group by 分組
需求
表在上線以後,我們需要對錶進行 alter 欄位處理
實現方式
mysql 如何透過 alter 新增一個欄位?如何修改一個欄位?
實際測試
mysql> select @@version;
+------------+
| @@version |
+------------+
| 5.7.31-log |
+------------+
建立一張測試表
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
age INT
);
新增欄位
alter table students add column create_time datetime(6) comment '建立時間';
測試效果
mysql> alter table students add column create_time datetime(6) comment '建立時間';
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
mysql> desc students;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| create_time | datetime(6) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
修改欄位
ALTER TABLE students MODIFY COLUMN name VARCHAR(256);
實際測試效果:
mysql> ALTER TABLE students MODIFY COLUMN name VARCHAR(256);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc students;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(256) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| create_time | datetime(6) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
修改欄位名稱+屬性
如果我們希望修改欄位名稱,需要使用 CHANGE COLUMN
ALTER TABLE students CHANGE COLUMN create_time created_time datetime(3) COMMENT '建立時間';
實際測試效果如下:
mysql> ALTER TABLE students CHANGE COLUMN create_time created_time datetime(3) COMMENT '建立時間';
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc students;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(256) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| created_time | datetime(3) | YES | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
場景2:如何把同一個表的多個 alter 語句合併為 1 個?
在 MySQL 中,你可以將多個 ALTER TABLE
語句合併為一個,以提高效率和減少表鎖定時間。這是透過在一個 ALTER TABLE
語句中指定多個修改來實現的。每個修改用逗號分隔。
假設你有以下多個 ALTER TABLE
語句:
ALTER TABLE my_table ADD COLUMN new_column1 VARCHAR(100);
ALTER TABLE my_table MODIFY COLUMN existing_column VARCHAR(256);
ALTER TABLE my_table ADD COLUMN new_column2 INT;
ALTER TABLE my_table DROP COLUMN old_column;
你可以將它們合併為一個 ALTER TABLE
語句,如下所示:
ALTER TABLE my_table
ADD COLUMN new_column1 VARCHAR(100),
MODIFY COLUMN existing_column VARCHAR(256),
ADD COLUMN new_column2 INT,
DROP COLUMN old_column;
示例
假設你有一個名為 students
的表,你想執行以下修改:
- 新增一個名為
email
的欄位,型別為VARCHAR(255)
。 - 修改
name
欄位的長度為VARCHAR(256)
。 - 新增一個名為
birthdate
的欄位,型別為DATE
。 - 刪除一個名為
old_field
的欄位。
將這些操作合併為一個 ALTER TABLE
語句:
ALTER TABLE students
ADD COLUMN email VARCHAR(255),
MODIFY COLUMN name VARCHAR(256),
ADD COLUMN birthdate DATE,
DROP COLUMN old_field;
注意事項
- 順序問題:在某些情況下,操作的順序可能很重要。例如,如果你要修改一個欄位的名稱然後更改其型別,確保先重新命名再修改型別。
- 相容性問題:確保所有操作在一個
ALTER TABLE
語句中執行時不會互相沖突。例如,刪除一個欄位然後再新增同名欄位在同一個語句中可能會出問題。 - 備份資料:在對錶結構進行重大更改之前,最好備份資料,以防出現意外情況。
合併 ALTER TABLE
語句不僅可以提高執行效率,還可以減少資料庫表的鎖定時間,尤其是在處理大表時,這一點尤為重要。
為什麼需要合併為一個?
將多個 ALTER TABLE
語句合併為一個有以下幾個主要原因和好處:
1. 減少表鎖定時間
每個 ALTER TABLE
操作都會對錶進行鎖定,阻止其他操作在同一時間修改表結構。多個 ALTER TABLE
語句將導致多次鎖定表,增加鎖定時間。而將多個修改合併為一個 ALTER TABLE
語句只會鎖定表一次,從而減少表的鎖定時間,提高併發操作的效能。
2. 提高執行效率
每個 ALTER TABLE
操作都需要對錶進行掃描和重新構建索引,這會增加執行時間。將多個操作合併為一個語句可以減少表掃描和索引重建的次數,從而提高執行效率。
3. 減少日誌和備份空間
每個 ALTER TABLE
操作都會生成一條日誌記錄。如果有大量的 ALTER TABLE
操作,這些日誌記錄會佔用大量的磁碟空間。合併操作可以減少日誌記錄的數量,節省磁碟空間。
4. 降低發生錯誤的機率
當你分多次執行 ALTER TABLE
語句時,任何一次操作的失敗都可能導致資料不一致。將所有操作合併在一起,可以保證所有修改要麼全部成功,要麼全部失敗,減少了資料不一致的風險。
示例對比
多次 ALTER TABLE
語句:
ALTER TABLE students ADD COLUMN email VARCHAR(255);
ALTER TABLE students MODIFY COLUMN name VARCHAR(256);
ALTER TABLE students ADD COLUMN birthdate DATE;
ALTER TABLE students DROP COLUMN old_field;
這些語句會導致表被鎖定四次,每次操作都會產生相應的日誌記錄,並且每次操作都會重新掃描表和重建索引。
合併後的 ALTER TABLE
語句:
ALTER TABLE students
ADD COLUMN email VARCHAR(255),
MODIFY COLUMN name VARCHAR(256),
ADD COLUMN birthdate DATE,
DROP COLUMN old_field;
這個語句只會鎖定表一次,減少表掃描和索引重建的次數,以及相應的日誌記錄。
結論
合併 ALTER TABLE
語句有助於提高效能,減少鎖定時間,節省磁碟空間,並降低資料不一致的風險。
這在處理大表或高併發環境下尤其重要,有助於保持資料庫的高效和穩定執行。