MySQL-17-mysql alter 語句如何實現?如何合并為一個

拓展閱讀

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: 0mysql>
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: 0mysql> 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: 0mysql> 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 的表,你想執行以下修改:

  1. 添加一個名為 email 的字段,類型為 VARCHAR(255)
  2. 修改 name 字段的長度為 VARCHAR(256)
  3. 添加一個名為 birthdate 的字段,類型為 DATE
  4. 刪除一個名為 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;

注意事項

  1. 順序問題:在某些情況下,操作的順序可能很重要。例如,如果你要修改一個字段的名稱然后更改其類型,確保先重命名再修改類型。
  2. 兼容性問題:確保所有操作在一個 ALTER TABLE 語句中執行時不會互相沖突。例如,刪除一個字段然后再添加同名字段在同一個語句中可能會出問題。
  3. 備份數據:在對表結構進行重大更改之前,最好備份數據,以防出現意外情況。

合并 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 語句有助于提高性能,減少鎖定時間,節省磁盤空間,并降低數據不一致的風險。

這在處理大表或高并發環境下尤其重要,有助于保持數據庫的高效和穩定運行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42418.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42418.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42418.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git使用中遇到的問題(隨時更新)

問題1.先創建本地庫,后拉取遠程倉庫時上傳失敗的問題怎么解決? 操作主要步驟: step1 設置遠程倉庫地址: $ git remote add origin gitgitee.com:yourAccount/reponamexxx.git step2 推送到遠程倉庫: $ git push -u origin "master&qu…

線程池理解及7個參數

定義理解 線程池其實是一種池化的技術實現,池化技術的核心思想就是實現資源的復用,避免資源的重復創建和銷毀帶來的性能開銷。線程池可以管理一堆線程,讓線程執行完任務之后不進行銷毀,而是繼續去處理其它線程已經提交的任務。 …

GStreamer學習5----probe數據探測

參考資料: gstreamer中如何使用probe(探針)獲取幀數據_gstreamer 視頻編碼時獲取視頻關鍵幀信息-CSDN博客 Gstreamer中可以使用AppSink作為一個分支來查看管線中的數據,還可以使用probe去處理。 在GStreamer中,probe…

LayerNorm Plugin的使用與說明

目錄 前言0. 簡述1. Layernorm Plugin的使用1.1 源碼下載1.2 模型下載和修改1.3 環境配置1.4 編譯1.4 engine生成和執行(trtexec)1.5 enging生成和執行(C API) 2. 補充說明2.1 RTMO顯存占用問題2.2 插件找不到的說明2.3 LayerNorm plugin封裝的嘗試2.4 layerNorm plugin核函數實…

拉曼光譜入門:3.拉曼光譜的特征參數與定量定性分析策略

1.特征參數 1.1 退偏振率 退偏振率(p)是一個衡量拉曼散射光偏振狀態的參數,它描述了拉曼散射光的偏振方向與入射光偏振方向之間的關系。退偏振率定義為垂直偏振方向的拉曼散射強度與平行偏振方向的拉曼散射強度之比。退偏振率(p&…

禁用windows的語音識別快捷鍵win+ctrl+s

win11組合鍵winctrls會彈出語音識別提示,即使到設置里禁用了語音識別也沒用 解決辦法:安裝PowerToys,通過“鍵盤管理器”-“重新映射快捷鍵”禁用 PowerToys是微軟自己的工具,不用擔心安全問題,下載地址:h…

系統設計題-簡易數據庫系統

一、設計一個簡易數據庫系統,包含create,insert,select三個指令。 create(int tableId,int colNum,String key):創建表,其id為tableId,如果該表已存在,則不做任何處理。colNum為表中列的數量&a…

洛谷 P3008 [USACO11JAN] Roads and Planes G

題意 有一張 n n n 點 ( m 1 m 2 ) (m_1m_2) (m1?m2?) 邊的無向圖,其中 m 1 m_1 m1? 條為無向邊,另外 m 2 m_2 m2? 條為有向邊, 無向邊的邊權可以為負。求 s s s 到其他每個點的最短路。 思路 使用 SPFA 會 T 掉一兩個點&#x…

第10章:網絡與信息安全

目錄 第10章:網絡與信息安全 網絡概述 計算機網絡概念 計算機網絡的分類 網絡的拓撲結構 ISO/OSI網絡體系結構 網絡互聯硬件 物理層互聯設備 數據鏈路層互聯設備 網絡層互聯設備 應用層互聯設備 網絡的協議與標準 網絡標準 TCP/IP協議族 網絡接口層協…

GCC擴展功能、函數,預處理命令

文章目錄 前言一、GCC C語言擴展聲明函數屬性變量屬性內斂匯編與原子操作相關的內建函數內存模型感知原子操作的內置函數使用溢出檢查執行算術的內置函數 - xxx 二、GCC C語言擴展interface和 pragmasTemplate 二、預處理過程及其指令預處理過程1. 字符集轉換2. Initial proces…

實現基于Spring Cloud的事件驅動微服務

實現基于Spring Cloud的事件驅動微服務 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 事件驅動架構在現代微服務架構中越來越受歡迎,它通過事件的…

【JAVA多線程】線程池概論

目錄 1.概述 2.ThreadPoolExector 2.1.參數 2.2.新任務提交流程 2.3.拒絕策略 2.4.代碼示例 1.概述 線程池的核心: 線程池的實現原理是個標準的生產消費者模型,調用方不停向線程池中寫數據,線程池中的線程組不停從隊列中取任務。 實現…

最新版Python安裝教程

一、安裝Python 1.下載Python 訪問Python官網: https:/www.oython.orgl 點擊downloads按鈕,在下拉框中選擇系統類型(windows/Mac OS./Linux等) 選擇下載最新穩定版本的Python 以下內容以演示安裝Windows操作系統64位的python 左邊是穩定發布版本Stabl…

python網絡編程-TCP/IP

鏈路層 幀組成(按順序): 目標MAC:6B 源MAC:6B 類型:2B 數據:46B-1500B CRC:4B 其中,源MAC為主機網卡地址,類型為來源網絡層的數據類型,ipv…

Self-Instruct構造Prompt的例子

人工構造一批Prompt做種子。(Starting with a small seed set of human-written tasks)每次把一些種子后來生成的Prompt,放到Input里做few-shot examples,用LLM生成更多的Prompt;(Using the LLM to generat…

PyTorch學習之torch.transpose函數

PyTorch學習之torch.transpose函數 一、簡介 torch.transpose 函數我們用于交換張量的維度。 二、語法 torch.transpose 函數用于交換給定張量的兩個維度,其語法如下: torch.transpose(input, dim0, dim1)三、參數 input:待交換維度的張…

kotlin 基礎

文章目錄 1、安裝 Java 和 Kotlin 環境2、程序代碼基本結構3、變量的聲明與使用4、數據類型5、數字類型的運算1)布爾類型2)字符類型3)字符串類型 6、 選擇結構1)(if - else)2) 選擇結構(when&am…

useImperativeHandle淺談

useImperativeHandle 是 React Hooks 提供的一個高級功能,它允許你在函數式組件中自定義并暴露特定的實例值或方法給父組件。主要的作用是: 自定義對外暴露的實例值或方法: 通常情況下,函數式組件內部的實例值或方法對外是不可見的&#xff0…

如何有效管理你的Facebook時間線?

Facebook作為全球最大的社交平臺之一,每天都有大量的信息和內容在用戶的時間線上展示。有效管理你的Facebook時間線,不僅可以提升用戶體驗,還能夠幫助你更好地控制信息流和社交互動。本文將探討多種方法和技巧,幫助你有效管理個人…

分班結果老師怎么發給家長?

分班結果老師怎么發給家長? 隨著新學期的腳步漸近,老師們的工作也變得愈發繁忙。從準備教學計劃到整理課程材料,每一項任務都不容小覷。而其中,分班結果的告知工作,更是讓不少老師頭疼不已。傳統的分班通知方式&#…